API del bridge JavaScript
Condivisione, appunti e stampa
Il foglio di condivisione di Android, gli appunti di sistema, il testo che un'altra app ha condiviso nella tua e la finestra di stampa.
AppMint.pdf helper#
AppMint.pdf.fromPage(options) / fromHtml(html, options)
Esempio
Crea un vero PDF (testo selezionabile, grafica vettoriale) senza finestra di stampa: fromPage salva la pagina cosĂŹ com'Ăš sullo schermo, impaginata con il tuo CSS @media print; fromHtml genera l'HTML che passi in una pagina invisibile all'indirizzo dell'app, quindi immagini, fogli di stile e font relativi si caricano come nella tua pagina, attende i font e ogni immagine, poi lo salva. window.print() apre comunque la normale finestra di stampa.
Restituisce: una Promise di {ok: true, fileName, pages, bytes, saved, uri?, base64?} oppure {ok: false, code, message}: code Ăš busy (un PDF alla volta), bad-options, failed, too-large (base64 oltre 25 MB) o permission-denied (archiviazione rifiutata su Android 7-9). Richiede: niente: ogni build lo include. Salvare in Download non richiede autorizzazioni su Android 10+.
Opzioni: fileName (".pdf" viene aggiunto; predefinito: il titolo della pagina), pageSize 'A4' (predefinito) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins in millimetri (un numero, oppure {top, right, bottom, left}; se omesso = la tua regola @page), save 'downloads' (predefinito) | 'share' | 'base64'.
Salva la pagina corrente in Download:
async function saveInvoice() {
if (!(window.AppMint && AppMint.pdf)) { window.print(); return; } // in a browser
var r = await AppMint.pdf.fromPage({ fileName: 'invoice-1042', pageSize: 'A4', margins: 12 });
if (r.ok) console.log('Saved ' + r.fileName + ' (' + r.pages + ' pages)');
else alert('Could not make the PDF: ' + r.message);
}Una ricevuta creata da HTML, direttamente nel foglio di condivisione (immagini e font vengono caricati prima di creare il PDF):
async function shareReceipt(order) {
var html = '<style>body{font-family:sans-serif} td{padding:4px 8px}</style>' +
'<img src="img/logo.png" width="120"><h1>Receipt #' + order.id + '</h1><table>' +
order.items.map(function (i) { return '<tr><td>' + i.name + '</td><td>' + i.price + '</td></tr>'; }).join('') +
'</table><p><b>Total ' + order.total + '</b></p>';
var r = await AppMint.pdf.fromHtml(html, { fileName: 'receipt-' + order.id, pageSize: 'Letter', save: 'share' });
if (!r.ok) console.warn(r.code, r.message);
}Recupera i byte per caricarli tu stesso:
async function uploadReport() {
var r = await AppMint.pdf.fromPage({ landscape: true, margins: { top: 10, right: 8, bottom: 10, left: 8 }, save: 'base64' });
if (!r.ok) return;
var bin = atob(r.base64), buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
await fetch('/api/reports', { method: 'POST', headers: { 'Content-Type': 'application/pdf' }, body: buf });
}Le chiamate dirette prendono le opzioni come testo JSON e un id di callback; usa invece l'helper qui sopra:
if (window.WebToApk && typeof window.WebToApk.pdfFromPage === 'function') {
// AppMint.pdf.fromPage wraps: WebToApk.pdfFromPage(JSON.stringify(options), callbackId)
// and AppMint.pdf.fromHtml wraps: WebToApk.pdfFromHtml(html, JSON.stringify(options), callbackId)
AppMint.pdf.fromPage({ save: 'downloads' }).then(function (r) { console.log(r); });
}Note: Nascondi pulsanti e menu dal PDF con @media print { .no-print { display: none } }. Un PDF scaricato mostra "Scaricato <nome> · Apri" come ogni download. fromHtml esegue gli script dell'HTML (i grafici disegnati da script compaiono) ma non ha accesso alle funzioni native dell'app. Le pagine piĂč lunghe di un foglio vengono divise come farebbe Chrome; usa break-before: page per controllare dove.
window.print standard web#
window.print()
Esempio
La chiamata di stampa standard, fatta funzionare nell'app: apre la schermata di stampa di Android, dove l'utente stampa su carta o salva un PDF.
Restituisce: niente. Richiede: niente.
document.getElementById('print-receipt').onclick = function () {
window.print();
};Nascondi i controlli dell'app sulla carta con un foglio di stile di stampa:
<style>
@media print {
nav, .toolbar, button { display: none !important; }
body { background: #fff; color: #000; }
}
</style>Stampa un'etichetta di spedizione senza la pagina intorno: un iframe srcdoc dello stesso dominio stampa solo il proprio documento:
function esc(s) {
return String(s).replace(/[&<>"]/g, function (c) {
return { '&': '&', '<': '<', '>': '>', '"': '"' }[c];
});
}
function printLabel(name, address) {
var frame = document.createElement('iframe');
frame.style.cssText = 'position:fixed;width:0;height:0;border:0';
frame.srcdoc = '<title>Label</title><style>body{font:18px sans-serif;margin:24px}</style>' +
'<b>' + esc(name) + '</b><br>' + esc(address).replace(/\n/g, '<br>');
frame.onload = function () {
frame.contentWindow.print();
setTimeout(function () { frame.remove(); }, 1000);
};
document.body.appendChild(frame);
}Note: window.print() stampa la pagina principale cosĂŹ com'Ăš disegnata ora. Un <iframe> dello stesso dominio, l'iframe nascosto che una libreria di stampa riempie con una ricevuta e su cui chiama iframe.contentWindow.print(), o una pagina in iframe che chiama il proprio window.print(), stampa il documento DI QUELL'iframe (vedi __printHtml). Un iframe di un altro dominio non puĂČ essere stampato dalla pagina. La sostituzione esiste prima del primo script della pagina. beforeprint non puĂČ essere annullato (in nessun browser).
__clipboardRead bridge#
window.WebToApk.__clipboardRead(): String
navigator.clipboard.read(): `{parts:[{type, text|base64}]}`. Stessa portata di readClipboard() in questa shell (che non ha controllo sull'origine).
Esempio
Trasporto interno dietro navigator.clipboard.read(). Le pagine usano l'API standard; non chiamare mai questo direttamente: i metodi __ possono cambiare senza preavviso.
Restituisce: {parts:[{type, text|base64}]}, la stessa portata di readClipboard() in questa app. Richiede: niente da attivare.
Usa l'API pubblica:
canvas.toBlob(async (png) => {
await navigator.clipboard.write([new ClipboardItem({ 'image/png': png })]);
});
const [item] = await navigator.clipboard.read();
if (item && item.types.includes('image/png')) preview(await item.getType('image/png'));Incolla testo formattato in un editor, mantenendo la formattazione quando gli appunti contengono HTML:
async function pasteRich(editor) {
try {
var items = await navigator.clipboard.read();
if (!items.length) { showMessage('The clipboard is empty'); return; }
var item = items[0];
if (item.types.includes('text/html')) {
editor.insertHtml(sanitize(await (await item.getType('text/html')).text()));
} else if (item.types.includes('text/plain')) {
editor.insertText(await (await item.getType('text/plain')).text());
}
} catch (e) {
showMessage('Could not read the clipboard');
}
}Incolla qualsiasi immagine copiata (PNG, JPEG, WebP…) come foto del profilo e distingui una lettura rifiutata:
document.getElementById('paste-photo').onclick = async function () {
try {
var items = await navigator.clipboard.read();
var item = items[0];
var type = item && item.types.find(function (t) { return t.indexOf('image/') === 0; });
if (!type) { showMessage('Copy a picture first'); return; }
uploadAvatar(await item.getType(type)); // a Blob of that type
} catch (e) {
if (e.name === 'NotAllowedError') showMessage('This page cannot read the clipboard');
else showMessage('Could not paste the picture');
}
};Note: Android 12+ mostra un proprio messaggio "incollato dagli appunti" quando un'app legge gli appunti.
__clipboardWrite bridge#
window.WebToApk.__clipboardWrite(partsJson: String): Boolean
navigator.clipboard.write(): [partsJson] Ăš `[{type, text}|{type, base64}]` per un ClipboardItem: text/plain, text/html o un'immagine copiata come content URI.
Esempio
Trasporto interno dietro navigator.clipboard.write([ClipboardItem]). Le pagine usano l'API standard; non chiamare mai questo direttamente: i metodi __ possono cambiare senza preavviso.
Restituisce: true quando il contenuto Ăš stato inserito. Richiede: niente da attivare.
Usa l'API pubblica:
canvas.toBlob(async (png) => {
await navigator.clipboard.write([new ClipboardItem({ 'image/png': png })]);
});
const [item] = await navigator.clipboard.read();
if (item && item.types.includes('image/png')) preview(await item.getType('image/png'));Copia il testo formattato e la sua versione semplice in un unico elemento, cosĂŹ gli editor avanzati ricevono la tabella e i campi semplici il testo:
async function copyTable(table) {
if (!(navigator.clipboard && navigator.clipboard.write && window.ClipboardItem)) return;
try {
await navigator.clipboard.write([new ClipboardItem({
'text/html': new Blob([table.outerHTML], { type: 'text/html' }),
'text/plain': new Blob([table.innerText], { type: 'text/plain' })
})]);
showMessage('Table copied');
} catch (e) {
showMessage('Could not copy (' + e.name + ')'); // NotAllowedError when the write fails
}
}Copia un'immagine mostrata dalla pagina, come un codice QR, cosĂŹ da poterla incollare in una chat:
async function copyImage(img) {
try {
var blob = await (await fetch(img.src)).blob(); // an image/* type, up to 16 MB
await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })]);
showMessage('Image copied');
} catch (e) {
showMessage('Could not copy the image');
}
}Note: Testo, HTML e un'immagine per elemento. L'immagine viene copiata come content URI tramite il FileProvider dell'app, quindi si incolla in WhatsApp, Gmail o Keep.
__printHtml bridge#
window.WebToApk.__printHtml(html: String, baseUrl: String, title: String)
Stampa [html] (il documento serializzato di un iframe dello stesso dominio, inviato dallo shim `window.print()` ([PrintShim])) tramite una WebView fuori schermo all'indirizzo [baseUrl], perchĂ© l'adattatore di stampa della WebView principale puĂČ stampare solo l'intera pagina. [title] dĂ il nome al lavoro di stampa ("<Nome app> Document" se vuoto).
Esempio
Trasporto interno dietro la stampa di un iframe: iframe.contentWindow.print() (e il window.print() della pagina di un iframe) invia qui il documento di quell'iframe, e l'app lo stampa tramite la schermata di stampa di Android. Le pagine usano le chiamate standard; non chiamare mai questo direttamente.
Restituisce: niente. Richiede: niente.
Lo schema della ricevuta che questo rende possibile: un iframe nascosto riempito solo con la ricevuta:
function printReceipt(order) {
var frame = document.createElement('iframe');
frame.style.display = 'none';
document.body.appendChild(frame);
var doc = frame.contentWindow.document;
doc.open();
doc.write('<html><head><title>Receipt ' + order.id + '</title>' +
'<style>body{font:14px sans-serif} td{padding:2px 8px}</style></head><body>' +
'<h2>Receipt ' + order.id + '</h2><table>' +
order.lines.map(function (l) { return '<tr><td>' + l.name + '</td><td>' + l.price + '</td></tr>'; }).join('') +
'</table></body></html>');
doc.close();
frame.contentWindow.print(); // prints the RECEIPT, not the page behind it
setTimeout(function () { frame.remove(); }, 1000);
}Una pagina biglietto tua, caricata in un iframe nascosto dello stesso dominio: il suo CSS e le sue immagini si caricano e il suo <title> dĂ il nome al lavoro di stampa:
function printTicket(id) {
var frame = document.createElement('iframe');
frame.style.cssText = 'position:fixed;width:0;height:0;border:0';
frame.src = 'ticket.html?id=' + encodeURIComponent(id);
frame.onload = function () {
frame.contentWindow.print(); // prints ticket.html's DOM as it stands now
setTimeout(function () { frame.remove(); }, 1000);
};
document.body.appendChild(frame);
}Modifica il documento dell'iframe poco prima dell'istantanea con beforeprint sulla finestra dell'iframe:
function printWithTimestamp(frame) {
var w = frame.contentWindow;
w.addEventListener('beforeprint', function () {
var p = w.document.createElement('p');
p.textContent = 'Printed ' + new Date().toLocaleString();
w.document.body.appendChild(p);
}, { once: true });
w.print(); // the printed copy includes the line added above
}Note: Gli argomenti sono (html, baseUrl, title): il documento serializzato dell'iframe, l'indirizzo rispetto a cui si risolvono i suoi link relativi (l'indirizzo della pagina stessa per un iframe about:blank) e il nome del lavoro di stampa (il <title> dell'iframe, altrimenti quello della pagina). L'istantanea viene scattata quando si chiama print(): gli script al suo interno non vengono rieseguiti, e beforeprint / afterprint scattano sulla finestra dell'iframe attorno ad essa. Un iframe di un altro dominio non puĂČ essere stampato dalla pagina.
copyToClipboard bridge#
window.WebToApk.copyToClipboard(text: String): Boolean
Usa il wrapper basato su promise: const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // scheda del negozio se non c'è la finestra r.result: 'shown' | 'not_from_play' | 'quota' | 'error'. Vedi RatePrompt.
Descritto dal suo gruppo, Finestra di recensione in-app di Google Play, e non da solo.
Esempio
Copia testo semplice negli appunti del telefono. Le pagine usano normalmente lo standard navigator.clipboard.writeText(text), che la shell indirizza qui.
Restituisce: true in caso di successo, false in caso di errore (in modo sincrono). Richiede: niente.
Prima l'API standard:
document.getElementById('copy-btn').onclick = async function () {
try {
await navigator.clipboard.writeText('PROMO-2026');
showMessage('Copied');
} catch (e) {
showMessage('Could not copy');
}
};La chiamata grezza:
if (window.WebToApk && typeof window.WebToApk.copyToClipboard === 'function') {
var ok = window.WebToApk.copyToClipboard('PROMO-2026');
showMessage(ok ? 'Copied' : 'Could not copy');
}Un pulsante "Copia" su ogni blocco di codice, usando la risposta sincrona per aggiornare l'etichetta:
document.querySelectorAll('pre').forEach(function (pre) {
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.onclick = function () {
var ok = !!(window.WebToApk && typeof window.WebToApk.copyToClipboard === 'function' &&
window.WebToApk.copyToClipboard(pre.innerText));
btn.textContent = ok ? 'Copied' : 'Copy failed';
setTimeout(function () { btn.textContent = 'Copy'; }, 1500);
};
pre.parentNode.insertBefore(btn, pre);
});Note: Solo testo semplice (niente immagini o HTML). Android 13+ mostra una propria piccola anteprima "Copiato", quindi lĂŹ potresti non aver bisogno di un tuo messaggio.
pdfFromHtml bridge#
window.WebToApk.pdfFromHtml(html: String, optionsJson: String, callbackId: String)
Genera [html] fuori schermo all'origine dell'app e lo salva come PDF: usa `AppMint.pdf.fromHtml(html, options)`.
Esempio
Documentato insieme a AppMint.pdf - l'esempio lì mostra anche questo.
Crea un vero PDF (testo selezionabile, grafica vettoriale) senza finestra di stampa: fromPage salva la pagina cosĂŹ com'Ăš sullo schermo, impaginata con il tuo CSS @media print; fromHtml genera l'HTML che passi in una pagina invisibile all'indirizzo dell'app, quindi immagini, fogli di stile e font relativi si caricano come nella tua pagina, attende i font e ogni immagine, poi lo salva. window.print() apre comunque la normale finestra di stampa.
Restituisce: una Promise di {ok: true, fileName, pages, bytes, saved, uri?, base64?} oppure {ok: false, code, message}: code Ăš busy (un PDF alla volta), bad-options, failed, too-large (base64 oltre 25 MB) o permission-denied (archiviazione rifiutata su Android 7-9). Richiede: niente: ogni build lo include. Salvare in Download non richiede autorizzazioni su Android 10+.
Opzioni: fileName (".pdf" viene aggiunto; predefinito: il titolo della pagina), pageSize 'A4' (predefinito) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins in millimetri (un numero, oppure {top, right, bottom, left}; se omesso = la tua regola @page), save 'downloads' (predefinito) | 'share' | 'base64'.
Salva la pagina corrente in Download:
async function saveInvoice() {
if (!(window.AppMint && AppMint.pdf)) { window.print(); return; } // in a browser
var r = await AppMint.pdf.fromPage({ fileName: 'invoice-1042', pageSize: 'A4', margins: 12 });
if (r.ok) console.log('Saved ' + r.fileName + ' (' + r.pages + ' pages)');
else alert('Could not make the PDF: ' + r.message);
}Una ricevuta creata da HTML, direttamente nel foglio di condivisione (immagini e font vengono caricati prima di creare il PDF):
async function shareReceipt(order) {
var html = '<style>body{font-family:sans-serif} td{padding:4px 8px}</style>' +
'<img src="img/logo.png" width="120"><h1>Receipt #' + order.id + '</h1><table>' +
order.items.map(function (i) { return '<tr><td>' + i.name + '</td><td>' + i.price + '</td></tr>'; }).join('') +
'</table><p><b>Total ' + order.total + '</b></p>';
var r = await AppMint.pdf.fromHtml(html, { fileName: 'receipt-' + order.id, pageSize: 'Letter', save: 'share' });
if (!r.ok) console.warn(r.code, r.message);
}Recupera i byte per caricarli tu stesso:
async function uploadReport() {
var r = await AppMint.pdf.fromPage({ landscape: true, margins: { top: 10, right: 8, bottom: 10, left: 8 }, save: 'base64' });
if (!r.ok) return;
var bin = atob(r.base64), buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
await fetch('/api/reports', { method: 'POST', headers: { 'Content-Type': 'application/pdf' }, body: buf });
}Le chiamate dirette prendono le opzioni come testo JSON e un id di callback; usa invece l'helper qui sopra:
if (window.WebToApk && typeof window.WebToApk.pdfFromPage === 'function') {
// AppMint.pdf.fromPage wraps: WebToApk.pdfFromPage(JSON.stringify(options), callbackId)
// and AppMint.pdf.fromHtml wraps: WebToApk.pdfFromHtml(html, JSON.stringify(options), callbackId)
AppMint.pdf.fromPage({ save: 'downloads' }).then(function (r) { console.log(r); });
}Note: Nascondi pulsanti e menu dal PDF con @media print { .no-print { display: none } }. Un PDF scaricato mostra "Scaricato <nome> · Apri" come ogni download. fromHtml esegue gli script dell'HTML (i grafici disegnati da script compaiono) ma non ha accesso alle funzioni native dell'app. Le pagine piĂč lunghe di un foglio vengono divise come farebbe Chrome; usa break-before: page per controllare dove.
pdfFromPage bridge#
window.WebToApk.pdfFromPage(optionsJson: String, callbackId: String)
Salva la pagina come PDF senza finestra di stampa: usa `AppMint.pdf.fromPage(options)`. [optionsJson] `{fileName, pageSize, landscape, margins, save}`; risolve [callbackId].
Esempio
Documentato insieme a AppMint.pdf - l'esempio lì mostra anche questo.
Crea un vero PDF (testo selezionabile, grafica vettoriale) senza finestra di stampa: fromPage salva la pagina cosĂŹ com'Ăš sullo schermo, impaginata con il tuo CSS @media print; fromHtml genera l'HTML che passi in una pagina invisibile all'indirizzo dell'app, quindi immagini, fogli di stile e font relativi si caricano come nella tua pagina, attende i font e ogni immagine, poi lo salva. window.print() apre comunque la normale finestra di stampa.
Restituisce: una Promise di {ok: true, fileName, pages, bytes, saved, uri?, base64?} oppure {ok: false, code, message}: code Ăš busy (un PDF alla volta), bad-options, failed, too-large (base64 oltre 25 MB) o permission-denied (archiviazione rifiutata su Android 7-9). Richiede: niente: ogni build lo include. Salvare in Download non richiede autorizzazioni su Android 10+.
Opzioni: fileName (".pdf" viene aggiunto; predefinito: il titolo della pagina), pageSize 'A4' (predefinito) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins in millimetri (un numero, oppure {top, right, bottom, left}; se omesso = la tua regola @page), save 'downloads' (predefinito) | 'share' | 'base64'.
Salva la pagina corrente in Download:
async function saveInvoice() {
if (!(window.AppMint && AppMint.pdf)) { window.print(); return; } // in a browser
var r = await AppMint.pdf.fromPage({ fileName: 'invoice-1042', pageSize: 'A4', margins: 12 });
if (r.ok) console.log('Saved ' + r.fileName + ' (' + r.pages + ' pages)');
else alert('Could not make the PDF: ' + r.message);
}Una ricevuta creata da HTML, direttamente nel foglio di condivisione (immagini e font vengono caricati prima di creare il PDF):
async function shareReceipt(order) {
var html = '<style>body{font-family:sans-serif} td{padding:4px 8px}</style>' +
'<img src="img/logo.png" width="120"><h1>Receipt #' + order.id + '</h1><table>' +
order.items.map(function (i) { return '<tr><td>' + i.name + '</td><td>' + i.price + '</td></tr>'; }).join('') +
'</table><p><b>Total ' + order.total + '</b></p>';
var r = await AppMint.pdf.fromHtml(html, { fileName: 'receipt-' + order.id, pageSize: 'Letter', save: 'share' });
if (!r.ok) console.warn(r.code, r.message);
}Recupera i byte per caricarli tu stesso:
async function uploadReport() {
var r = await AppMint.pdf.fromPage({ landscape: true, margins: { top: 10, right: 8, bottom: 10, left: 8 }, save: 'base64' });
if (!r.ok) return;
var bin = atob(r.base64), buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
await fetch('/api/reports', { method: 'POST', headers: { 'Content-Type': 'application/pdf' }, body: buf });
}Le chiamate dirette prendono le opzioni come testo JSON e un id di callback; usa invece l'helper qui sopra:
if (window.WebToApk && typeof window.WebToApk.pdfFromPage === 'function') {
// AppMint.pdf.fromPage wraps: WebToApk.pdfFromPage(JSON.stringify(options), callbackId)
// and AppMint.pdf.fromHtml wraps: WebToApk.pdfFromHtml(html, JSON.stringify(options), callbackId)
AppMint.pdf.fromPage({ save: 'downloads' }).then(function (r) { console.log(r); });
}Note: Nascondi pulsanti e menu dal PDF con @media print { .no-print { display: none } }. Un PDF scaricato mostra "Scaricato <nome> · Apri" come ogni download. fromHtml esegue gli script dell'HTML (i grafici disegnati da script compaiono) ma non ha accesso alle funzioni native dell'app. Le pagine piĂč lunghe di un foglio vengono divise come farebbe Chrome; usa break-before: page per controllare dove.
print bridge#
window.WebToApk.print()
Passa la pagina cosĂŹ com'Ăš ora alla finestra di stampa di Android, che puĂČ stampare su carta o salvare un PDF. Niente da configurare: la WebView genera il documento.
Descritta dal suo gruppo, Stampa, e non singolarmente.
Esempio
Apre la schermata di stampa di Android per la pagina cosĂŹ com'Ăš ora: stampa su carta o "Salva come PDF". Le pagine usano normalmente lo standard window.print(), che la shell indirizza qui.
Restituisce: niente. Richiede: niente.
Prima l'API standard:
document.getElementById('print-btn').onclick = function () {
window.print(); // in the app: the Android print screen
};La chiamata diretta fa la stessa cosa:
if (window.WebToApk && typeof window.WebToApk.print === 'function') {
window.WebToApk.print();
}Stampa una fattura da un elenco contrassegnandola per un foglio di stile di stampa (lascia il contrassegno: la schermata di stampa impagina la pagina dopo che print() Ăš tornato):
// CSS: @media print { .invoice:not(.print-me), nav, button { display: none !important; } }
function printInvoice(id) {
document.querySelectorAll('.invoice.print-me').forEach(function (el) {
el.classList.remove('print-me');
});
document.getElementById('invoice-' + id).classList.add('print-me');
if (window.WebToApk && typeof window.WebToApk.print === 'function') {
window.WebToApk.print();
} else {
window.print(); // a normal browser
}
}Note: Stampa l'intera WebView, cioĂš la pagina principale. Il print() di un iframe dello stesso dominio stampa solo quell'iframe (vedi window.print). Usa un foglio di stile @media print per nascondere pulsanti e menu. Il lavoro si chiama "<Nome app> Document". Gli errori vengono solo registrati.
readClipboard bridge#
window.WebToApk.readClipboard(): String
Usa il wrapper basato su promise: const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // scheda del negozio se non c'è la finestra r.result: 'shown' | 'not_from_play' | 'quota' | 'error'. Vedi RatePrompt.
Descritto dal suo gruppo, Finestra di recensione in-app di Google Play, e non da solo.
Esempio
Legge il testo presente ora negli appunti del telefono. Le pagine usano normalmente lo standard navigator.clipboard.readText(), che la shell indirizza qui.
Restituisce: il testo, oppure "" quando gli appunti sono vuoti o non leggibili (in modo sincrono). Richiede: niente.
Prima l'API standard, per esempio un pulsante "Incolla codice":
document.getElementById('paste-btn').onclick = async function () {
try {
var text = await navigator.clipboard.readText();
if (text) document.getElementById('code').value = text.trim();
else showMessage('The clipboard is empty');
} catch (e) {
showMessage('Could not read the clipboard');
}
};La chiamata grezza:
if (window.WebToApk && typeof window.WebToApk.readClipboard === 'function') {
var text = window.WebToApk.readClipboard();
if (text) document.getElementById('code').value = text;
}Un pulsante "Incolla link" che estrae il primo indirizzo web da ciĂČ che Ăš stato copiato:
document.getElementById('paste-link').onclick = function () {
if (!(window.WebToApk && typeof window.WebToApk.readClipboard === 'function')) return;
var text = window.WebToApk.readClipboard();
var m = /https?:\/\/\S+/.exec(text);
if (m) document.getElementById('link').value = m[0];
else showMessage('There is no link on the clipboard');
};Note: Solo le pagine della tua app possono leggerli: un sito esterno aperto nell'app ottiene "". Android permette all'app di leggere gli appunti solo mentre Ăš in primo piano, e Android 12+ mostra un avviso "incollato dagli appunti": leggili da un tocco dell'utente, non al caricamento della pagina.