API del puente de JavaScript
Compartir, portapapeles e imprimir
La hoja para compartir de Android, el portapapeles del sistema, el texto que otra app compartió con la tuya y el diálogo de impresión.
AppMint.pdf ayudante#
AppMint.pdf.fromPage(options) / fromHtml(html, options)
Ejemplo
Crea un PDF real (texto seleccionable, gráficos vectoriales) sin diálogo de impresión: fromPage guarda la página tal como está en pantalla, con el diseño de tu CSS @media print; fromHtml renderiza el HTML que le pases en una página invisible en la propia dirección de la app, de modo que las imágenes, hojas de estilo y fuentes relativas se cargan como en tu página; espera a las fuentes y a todas las imágenes y luego lo guarda. window.print() sigue abriendo el diálogo de impresión normal.
Devuelve: una Promise de {ok: true, fileName, pages, bytes, saved, uri?, base64?} o {ok: false, code, message}; code es busy (un PDF a la vez), bad-options, failed, too-large (base64 de más de 25 MB) o permission-denied (almacenamiento rechazado en Android 7-9). Requiere: nada: todas las compilaciones lo tienen. Guardar en Descargas no necesita permiso en Android 10+.
Opciones: fileName (se añade ".pdf"; por defecto: el título de la página), pageSize 'A4' (por defecto) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins en milímetros (un número o {top, right, bottom, left}; si se omite = tu propia regla @page), save 'downloads' (por defecto) | 'share' | 'base64'.
Guardar la página actual en Descargas:
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);
}Un recibo creado desde HTML, directo a la hoja para compartir (las imágenes y fuentes se cargan antes de crear el 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 los bytes para subirlos tú mismo:
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 });
}Las llamadas directas reciben las opciones como texto JSON y un id de callback; usa mejor el helper anterior:
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); });
}Notas: Oculta botones y menús del PDF con @media print { .no-print { display: none } }. Un PDF descargado muestra «Descargado <name> · Abrir» como cualquier descarga. fromHtml ejecuta los scripts del HTML (aparecen los gráficos dibujados por script) pero no tiene acceso a las funciones nativas de la app. Las páginas más largas que una hoja se dividen como lo haría Chrome; usa break-before: page para controlar dónde.
window.print estándar web#
window.print()
Ejemplo
La llamada de impresión estándar, adaptada para funcionar dentro de la app: abre la pantalla de impresión de Android, donde el usuario imprime en papel o guarda un PDF.
Devuelve: nada. Requiere: nada.
document.getElementById('print-receipt').onclick = function () {
window.print();
};Oculta los controles de la app en el papel con una hoja de estilos de impresión:
<style>
@media print {
nav, .toolbar, button { display: none !important; }
body { background: #fff; color: #000; }
}
</style>Imprime una etiqueta de envío sin la página alrededor: un iframe srcdoc del mismo origen imprime solo su propio 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);
}Notas: window.print() imprime la página principal tal como está dibujada ahora. Un <iframe> del mismo origen (el iframe oculto que una biblioteca de impresión rellena con un recibo y al que llama iframe.contentWindow.print(), o una página en un iframe que llama a su propio window.print()) imprime el documento de ESE iframe (ver __printHtml). Un iframe de otro origen no se puede imprimir desde la página. El reemplazo existe antes del primer script de la página. beforeprint no se puede cancelar (en ningún navegador).
__clipboardRead puente#
window.WebToApk.__clipboardRead(): String
navigator.clipboard.read(): `{parts:[{type, text|base64}]}`. Mismo alcance que readClipboard() en esta shell (que no tiene control de origen).
Ejemplo
Transporte interno detrás de navigator.clipboard.read(). Las páginas usan la API estándar; nunca llames a esto directamente: los métodos __ pueden cambiar sin previo aviso.
Devuelve: {parts:[{type, text|base64}]}: el mismo alcance que readClipboard() en esta app. Requiere: nada que activar.
Usa la API pública:
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'));Pega texto con formato en un editor, conservando el formato cuando el portapapeles tiene 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');
}
}Pega cualquier imagen copiada (PNG, JPEG, WebP…) como foto de perfil y distingue una lectura rechazada:
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');
}
};Notas: Android 12+ muestra su propio mensaje de «pegado desde tu portapapeles» cuando una app lee el portapapeles.
__clipboardWrite puente#
window.WebToApk.__clipboardWrite(partsJson: String): Boolean
navigator.clipboard.write(): [partsJson] es `[{type, text}|{type, base64}]` para un ClipboardItem: text/plain, text/html o una imagen que se copia como URI de contenido.
Ejemplo
Transporte interno detrás de navigator.clipboard.write([ClipboardItem]). Las páginas usan la API estándar; nunca llames a esto directamente: los métodos __ pueden cambiar sin previo aviso.
Devuelve: true cuando se colocó el contenido. Requiere: nada que activar.
Usa la API pública:
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 texto con formato y su versión sin formato en un solo elemento, para que los editores ricos reciban la tabla y los campos simples reciban el texto:
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 una imagen que muestra la página, como un código QR, para poder pegarla en un 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');
}
}Notas: Texto, HTML y una imagen por elemento. La imagen se copia como URI de contenido mediante el FileProvider de la app, así que se pega en WhatsApp, Gmail o Keep.
__printHtml puente#
window.WebToApk.__printHtml(html: String, baseUrl: String, title: String)
Imprime [html] (el documento serializado de un iframe del mismo origen, enviado por el shim de `window.print()` ([PrintShim])) mediante un WebView fuera de pantalla en [baseUrl], porque el adaptador de impresión del WebView principal solo puede imprimir la página completa. [title] da nombre al trabajo de impresión («<App name> Document» cuando está en blanco).
Ejemplo
Transporte interno detrás de la impresión de un iframe: iframe.contentWindow.print() (y el propio window.print() de una página en un iframe) envía aquí el documento de ese iframe, y la app lo imprime mediante la pantalla de impresión de Android. Las páginas usan las llamadas estándar; nunca llames a esto directamente.
Devuelve: nada. Requiere: nada.
El patrón de recibo que esto hace posible: un iframe oculto relleno solo con el recibo:
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 página de ticket propia, cargada en un iframe oculto del mismo origen: se cargan su CSS e imágenes, y su <title> da nombre al trabajo de impresión:
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);
}Ajusta el documento del iframe justo antes de la captura con beforeprint en la ventana del 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
}Notas: Los argumentos son (html, baseUrl, title): el documento serializado del iframe, la dirección con la que se resuelven sus enlaces relativos (la dirección de la propia página para un iframe about:blank) y el nombre del trabajo de impresión (el <title> del iframe, o si no el de la página). La captura se toma cuando se llama a print(); los scripts dentro no se vuelven a ejecutar, y beforeprint / afterprint se activan en la ventana del iframe antes y después. Un iframe de otro origen no se puede imprimir desde la página.
copyToClipboard puente#
window.WebToApk.copyToClipboard(text: String): Boolean
Usa el envoltorio de promesa: const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // ficha de la tienda si no hay hoja r.result: 'shown' | 'not_from_play' | 'quota' | 'error'. Consulta RatePrompt.
Descrito por su grupo, La hoja de reseñas dentro de la app de Google Play, y no por sí mismo.
Ejemplo
Copia texto sin formato al portapapeles del teléfono. Las páginas normalmente usan el navigator.clipboard.writeText(text) estándar, que la shell redirige aquí.
Devuelve: true si tuvo éxito, false si falló (de forma síncrona). Requiere: nada.
Primero la API estándar:
document.getElementById('copy-btn').onclick = async function () {
try {
await navigator.clipboard.writeText('PROMO-2026');
showMessage('Copied');
} catch (e) {
showMessage('Could not copy');
}
};La llamada en bruto:
if (window.WebToApk && typeof window.WebToApk.copyToClipboard === 'function') {
var ok = window.WebToApk.copyToClipboard('PROMO-2026');
showMessage(ok ? 'Copied' : 'Could not copy');
}Un botón «Copiar» en cada bloque de código, usando la respuesta síncrona para actualizar la etiqueta:
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);
});Notas: Solo texto sin formato (sin imágenes ni HTML). Android 13+ muestra su propia pequeña vista previa de «Copiado», así que quizá no necesites tu propio mensaje ahí.
pdfFromHtml puente#
window.WebToApk.pdfFromHtml(html: String, optionsJson: String, callbackId: String)
Renderiza [html] fuera de pantalla en el origen de la app y lo guarda como PDF; usa `AppMint.pdf.fromHtml(html, options)`.
Ejemplo
Documentado junto con AppMint.pdf: el ejemplo de allí también muestra este.
Crea un PDF real (texto seleccionable, gráficos vectoriales) sin diálogo de impresión: fromPage guarda la página tal como está en pantalla, con el diseño de tu CSS @media print; fromHtml renderiza el HTML que le pases en una página invisible en la propia dirección de la app, de modo que las imágenes, hojas de estilo y fuentes relativas se cargan como en tu página; espera a las fuentes y a todas las imágenes y luego lo guarda. window.print() sigue abriendo el diálogo de impresión normal.
Devuelve: una Promise de {ok: true, fileName, pages, bytes, saved, uri?, base64?} o {ok: false, code, message}; code es busy (un PDF a la vez), bad-options, failed, too-large (base64 de más de 25 MB) o permission-denied (almacenamiento rechazado en Android 7-9). Requiere: nada: todas las compilaciones lo tienen. Guardar en Descargas no necesita permiso en Android 10+.
Opciones: fileName (se añade ".pdf"; por defecto: el título de la página), pageSize 'A4' (por defecto) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins en milímetros (un número o {top, right, bottom, left}; si se omite = tu propia regla @page), save 'downloads' (por defecto) | 'share' | 'base64'.
Guardar la página actual en Descargas:
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);
}Un recibo creado desde HTML, directo a la hoja para compartir (las imágenes y fuentes se cargan antes de crear el 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 los bytes para subirlos tú mismo:
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 });
}Las llamadas directas reciben las opciones como texto JSON y un id de callback; usa mejor el helper anterior:
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); });
}Notas: Oculta botones y menús del PDF con @media print { .no-print { display: none } }. Un PDF descargado muestra «Descargado <name> · Abrir» como cualquier descarga. fromHtml ejecuta los scripts del HTML (aparecen los gráficos dibujados por script) pero no tiene acceso a las funciones nativas de la app. Las páginas más largas que una hoja se dividen como lo haría Chrome; usa break-before: page para controlar dónde.
pdfFromPage puente#
window.WebToApk.pdfFromPage(optionsJson: String, callbackId: String)
Guarda la página como PDF sin diálogo de impresión; usa `AppMint.pdf.fromPage(options)`. [optionsJson] `{fileName, pageSize, landscape, margins, save}`; resuelve [callbackId].
Ejemplo
Documentado junto con AppMint.pdf: el ejemplo de allí también muestra este.
Crea un PDF real (texto seleccionable, gráficos vectoriales) sin diálogo de impresión: fromPage guarda la página tal como está en pantalla, con el diseño de tu CSS @media print; fromHtml renderiza el HTML que le pases en una página invisible en la propia dirección de la app, de modo que las imágenes, hojas de estilo y fuentes relativas se cargan como en tu página; espera a las fuentes y a todas las imágenes y luego lo guarda. window.print() sigue abriendo el diálogo de impresión normal.
Devuelve: una Promise de {ok: true, fileName, pages, bytes, saved, uri?, base64?} o {ok: false, code, message}; code es busy (un PDF a la vez), bad-options, failed, too-large (base64 de más de 25 MB) o permission-denied (almacenamiento rechazado en Android 7-9). Requiere: nada: todas las compilaciones lo tienen. Guardar en Descargas no necesita permiso en Android 10+.
Opciones: fileName (se añade ".pdf"; por defecto: el título de la página), pageSize 'A4' (por defecto) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins en milímetros (un número o {top, right, bottom, left}; si se omite = tu propia regla @page), save 'downloads' (por defecto) | 'share' | 'base64'.
Guardar la página actual en Descargas:
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);
}Un recibo creado desde HTML, directo a la hoja para compartir (las imágenes y fuentes se cargan antes de crear el 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 los bytes para subirlos tú mismo:
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 });
}Las llamadas directas reciben las opciones como texto JSON y un id de callback; usa mejor el helper anterior:
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); });
}Notas: Oculta botones y menús del PDF con @media print { .no-print { display: none } }. Un PDF descargado muestra «Descargado <name> · Abrir» como cualquier descarga. fromHtml ejecuta los scripts del HTML (aparecen los gráficos dibujados por script) pero no tiene acceso a las funciones nativas de la app. Las páginas más largas que una hoja se dividen como lo haría Chrome; usa break-before: page para controlar dónde.
print puente#
window.WebToApk.print()
Entrega la página tal como está ahora al diálogo de impresión de Android, que puede imprimir en papel o guardar un PDF. Nada que configurar: el WebView renderiza el documento.
Descrito por su grupo, Impresión, en lugar de por separado.
Ejemplo
Abre la pantalla de impresión de Android con la página tal como se ve ahora: imprime en papel o «Guardar como PDF». Las páginas normalmente usan el window.print() estándar, que la shell redirige aquí.
Devuelve: nada. Requiere: nada.
Primero la API estándar:
document.getElementById('print-btn').onclick = function () {
window.print(); // in the app: the Android print screen
};La llamada directa hace lo mismo:
if (window.WebToApk && typeof window.WebToApk.print === 'function') {
window.WebToApk.print();
}Imprime una factura de una lista marcándola para una hoja de estilos de impresión (deja la marca puesta: la pantalla de impresión maqueta la página después de que print() devuelva):
// 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
}
}Notas: Imprime todo el WebView, la página principal. El propio print() de un iframe del mismo origen imprime solo ese iframe (ver window.print). Usa una hoja de estilos @media print para ocultar botones y menús. El trabajo se llama «<App name> Document». Los errores solo se registran.
readClipboard puente#
window.WebToApk.readClipboard(): String
Usa el envoltorio de promesa: const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // ficha de la tienda si no hay hoja r.result: 'shown' | 'not_from_play' | 'quota' | 'error'. Consulta RatePrompt.
Descrito por su grupo, La hoja de reseñas dentro de la app de Google Play, y no por sí mismo.
Ejemplo
Lee el texto que hay ahora en el portapapeles del teléfono. Las páginas normalmente usan el navigator.clipboard.readText() estándar, que la shell redirige aquí.
Devuelve: el texto, o "" cuando el portapapeles está vacío o no se puede leer (de forma síncrona). Requiere: nada.
Primero la API estándar, por ejemplo un botón «Pegar código»:
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 llamada en bruto:
if (window.WebToApk && typeof window.WebToApk.readClipboard === 'function') {
var text = window.WebToApk.readClipboard();
if (text) document.getElementById('code').value = text;
}Un botón «Pegar enlace» que extrae la primera dirección web de lo que se haya copiado:
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');
};Notas: Solo las páginas de tu propia app pueden leerlo: un sitio web ajeno abierto dentro de la app recibe "". Android solo permite que la app lea el portapapeles mientras está en pantalla, y Android 12+ muestra un aviso de «pegado desde el portapapeles»: léelo con un toque del usuario, no al cargar la página.