Escáner de códigos QR
qrcode:// abre el escáner nativo y carga la URL escaneada en la app, así que codifica URL de tu propio dominio. Para códigos de barras de productos usa barcodescanner:// y lee barcodescanresult.
Claude Code
WebViewGold expone las capacidades nativas a tu app web como esquemas de URL y unas pocas variables globales de JavaScript. Eso las convierte en un trabajo ideal para un agente: indícale a Claude Code dónde está la documentación, dile qué funciones activaste y las integrará en tus componentes existentes. Así se hace sin nombres de API inventados.
Desde $109 de pago único por plataforma, o deja que nuestro equipo lo haga todo desde $698.
Tu app web le pide algo al envoltorio navegando a un esquema, por ejemplo window.location.href = "bioauth://". El envoltorio intercepta la navegación, realiza la acción nativa y responde llamando a una función global que tú definiste (onBioAuthSuccess()), inyectando una variable global (onesignalplayerid, nativePushEnabled, barcodescanresult) o cargando una URL (el escáner QR abre la URL escaneada en la app). No hay ningún SDK que instalar ni nada que empaquetar.
Todo está documentado en un único archivo legible por máquinas: webviewgold.com/llms-full.txt. Dile a Claude Code que lea la sección correspondiente antes de escribir código y usará los nombres exactos de los esquemas en lugar de otros que solo suenan plausibles. Cada esquema de este artículo se ha comprobado con ese archivo.
Ajusta la lista de funciones a lo que activaste en Config.swift y Config.java.
Nuestra app web también se ejecuta dentro de apps nativas de iOS y Android creadas con WebViewGold. Las funciones nativas se activan navegando a esquemas de URL y los resultados vuelven como variables globales de JavaScript o como funciones de callback globales. Antes de escribir código, descarga https://www.webviewgold.com/llms-full.txt y lee las secciones de: Push Notifications API, Biometric Authentication API, QR Code Scanner API, App Sharing Dialog API, Haptic Feedback API, File Downloader API, HTML5 Geolocation API. Usa solo nombres de esquemas que aparezcan en ese archivo. Después implementa, en src/lib/native.ts: isNativeApp() (el user agent contiene el token WebViewGoldApp), callNative(scheme) (asigna window.location.href solo cuando isNativeApp() es true; en caso contrario devuelve false) y un helper readInjected(name, timeoutMs) que consulte periódicamente una variable global inyectada por el envoltorio. Integra estas funciones en la interfaz existente, cada una protegida con isNativeApp() y con una alternativa web: 1. Push: un botón Activar notificaciones que llame a registerpush://, una fila en los ajustes que llame a checkNativePushPermissions:// y lea nativePushEnabled, y tras el inicio de sesión una llamada a getonesignalplayerid:// que lea onesignalplayerid y lo guarde en el perfil del usuario a través de nuestra API. 2. Biometría: un bloqueo con Face ID / huella dactilar para la ruta /wallet usando bioauth:// y los tres callbacks onBioAuthSuccess, onBioAuthFailure(errorCode, errorMessage) y onBioAuthUnavailable; si no está disponible, recurre a volver a pedir la contraseña, como ya hacemos. 3. Check-in con QR: un botón Escanear que llame a qrcode://; nuestros códigos QR contienen URL de nuestro propio dominio, así que gestiona la ruta /checkin que abren. 4. Compartir: sustituye el botón de copiar enlace por shareapp://message?=TEXT&url=URL cuando sea nativo, con encodeURIComponent en ambos valores. 5. Hápticos: successhaptic:// tras completar un pedido, errorhaptic:// en los errores de validación de formularios, lighthaptic:// al cambiar de pestaña. En iOS, usa la técnica del iframe de la documentación para que los hápticos no interrumpan la navegación. 6. Descargas: las descargas de imágenes usan savethisimage://?url=IMAGE_URL; los enlaces a PDF siguen siendo enlaces normales. 7. Geolocalización: mantén navigator.geolocation, pero muestra la primera vez una pantalla que explique el permiso antes de pedirlo. Indícame qué opciones de Config.swift / Config.java y qué entradas de Info.plist o AndroidManifest debo activar para cada función.
Pequeño, independiente del framework y el único lugar que sabe del user agent.
// src/lib/native.ts
export function isNativeApp() {
return typeof navigator !== "undefined" && navigator.userAgent.indexOf("WebViewGoldApp") !== -1;
}
export function callNative(scheme) {
if (!isNativeApp()) return false;
window.location.href = scheme;
return true;
}
// Wait for a variable the wrapper injects, e.g. onesignalplayerid or nativePushEnabled
export function readInjected(name, timeoutMs) {
return new Promise(function (resolve, reject) {
var started = Date.now();
(function check() {
if (typeof window[name] !== "undefined") return resolve(window[name]);
if (Date.now() - started > (timeoutMs || 3000)) return reject(new Error(name + " not injected"));
setTimeout(check, 100);
})();
});
}
¡Estoy muy feliz de haber comprado esta aplicación! Documentación extremadamente fácil y excelente. Estaba en contacto con el servicio al cliente, respondieron muy rápido y de forma muy amigable. Resolvieron mi pregunta en un día. 10/10 lo recomendaría".
Requiere un servicio push activado en el envoltorio (OneSignal mediante kPushEnabled y oneSignalID en Config.swift, PUSH_ENABLED más los ID en build.gradle en Android). Pon askforpushpermissionatfirstrun (iOS) y requirePush (Android) en false para que seas tú quien decida cuándo aparece el aviso.
import { callNative, readInjected } from "./native";
// 1. Ask at the right moment (after onboarding, not on first launch)
export function askForPush() {
return callNative("registerpush://");
}
// 2. Is push currently allowed? Sets window.nativePushEnabled
export async function isPushEnabled() {
if (!callNative("checkNativePushPermissions://")) return null;
return readInjected("nativePushEnabled", 2000);
}
// 3. Store the OneSignal subscription ID on the user so the server can target this device
export async function syncPushId(saveToProfile) {
if (!callNative("getonesignalplayerid://")) return;
var id = await readInjected("onesignalplayerid", 3000);
await saveToProfile(id);
}
// 4. A local reminder in two hours, no push service needed
export function scheduleLocalReminder(title, message, url) {
var seconds = 2 * 60 * 60;
callNative("sendlocalpushmsg://push.send?s=" + seconds + "=msg!" + message + "&!#" + title + "&!#" + url);
}En iOS, el proyecto necesita la descripción de uso de Face ID en Info.plist (NSFaceIDUsageDescription); Android usa el BiometricPrompt del sistema y no necesita nada más. El envoltorio llama a las funciones globales, así que defínelas en window.
import { callNative } from "./native";
export function requireBiometrics(onPass, onFallback) {
window.onBioAuthSuccess = function () { onPass(); };
window.onBioAuthFailure = function (errorCode, errorMessage) {
console.warn("bioauth failed", errorCode, errorMessage);
onFallback();
};
window.onBioAuthUnavailable = function () { onFallback(); };
if (!callNative("bioauth://")) onFallback(); // browser: use the password re-entry instead
}
// Security note from the documentation: treat the success callback as a UI gate only.
// Keep sensitive actions behind a server-side session check as well.qrcode:// abre el escáner nativo y carga la URL escaneada en la app, así que codifica URL de tu propio dominio. Para códigos de barras de productos usa barcodescanner:// y lee barcodescanresult.
shareapp://message?=TEXT&url=URL abre el diálogo de compartir del sistema en ambas plataformas. Codifica ambos valores. En Android, la API ShareIntent permite además que otras apps compartan contenido con la tuya.
lighthaptic://, heavyhaptic://, successhaptic://, warninghaptic://, errorhaptic://; mediumhaptic:// es solo para iOS. La documentación muestra un helper con iframe para que la llamada no cancele una navegación en curso.
savethisimage://?url=… guarda una imagen en la fototeca. Los enlaces que terminan en .pdf, .docx, .xlsx, .mp3 y otras extensiones de la lista se descargan de forma nativa; amplía la lista con extentionARY (Config.swift) o downloadableExtension (Config.java), o activa autodownloader / AUTO_DOWNLOAD_FILES para las cabeceras Content-Disposition.
El navigator.geolocation normal funciona; el envoltorio muestra el diálogo de permiso nativo. iOS necesita HTTPS y el texto de descripción de uso de la ubicación en Info.plist; Android necesita requireLocation en true en Config.java, con las entradas del manifiesto correspondientes.
| Función | iOS (Config.swift / proyecto) | Android (Config.java / proyecto) |
|---|---|---|
| Push (OneSignal) | kPushEnabled, oneSignalID; documentación | PUSH_ENABLED, ID en build.gradle; documentación |
| Biometría | Descripción de uso de Face ID en Info.plist; documentación | No requiere ningún ajuste; documentación |
| QR / código de barras | Descripción de uso de la cámara; qrcodelinks decide dónde se abren las URL escaneadas; documentación | requireCamera, QR_CODE_URL_OPTIONS; documentación |
| Compartir, hápticos | No hay nada que activar; documentación | No hay nada que activar; documentación |
| Descargas | extentionARY, autodownloader; documentación | downloadableExtension, AUTO_DOWNLOAD_FILES, requireStorage; documentación |
| Geolocalización | Descripción de uso de la ubicación en Info.plist; documentación | requireLocation; documentación |
Necesita descargar el archivo una vez. Si tu entorno bloquea el acceso web, descarga el archivo en el repositorio (por ejemplo, docs/webviewgold-llms-full.txt) y haz referencia a esa ruta en CLAUDE.md.
Porque así el servidor puede enviar un push a una persona concreta (pedido enviado, nueva respuesta). Sin el ID solo puedes hacer envíos masivos a segmentos.
Sí, para los valores de Config.swift y Config.java y los textos de permisos. Mantén la firma y el aprovisionamiento fuera de su alcance; la guía de configuración del proyecto explica los límites.
Nada visible. Por ejemplo, registerpush:// sin un servicio push activo no tiene ningún efecto. Activa primero la función en el envoltorio y después prueba la llamada.
El mismo resultado, con distinta cantidad de trabajo por tu parte. Las tres incluyen la garantía de aprobación y soporte humano 24/7.
$109 por plataforma, pago único
La licencia de WebViewGold: un proyecto de Xcode o Android Studio listo para usar. Pega tu URL, define nombre e icono, activa funciones, compila y envía. Actualizaciones gratuitas para siempre.
Ver planes en la página principal$349 por licencia, complemento de pago único
Sin Mac, sin Xcode, sin Android Studio: configura en el navegador, compilamos ambas apps en la nube y las entregamos a App Store Connect y a Play Console.
Cómo funciona el Cloud Builder Prueba la demo gratuita$698 por plataforma $798
Envíanos tu URL y tu icono. Nuestro equipo configura, compila y entrega tu app en 72 horas, en marca blanca y con los proyectos fuente. Ambas plataformas por $1,158.
Detalles del Full Service Con tecnología dePrecios de la Oferta de invierno válidos hasta el 31 de diciembre de 2026.
Garantía de aprobación en App Store & Google Play – o te devolvemos el dinero en 14 días
¿Prefieres delegarlo? Full Service: configuramos, compilamos y entregamos en 72 horas, desde $698 por plataforma. ¿Preguntas? Chatea con nosotros 24/7.
Los reembolsos se conceden bajo las condiciones indicadas en nuestras FAQ: un rechazo por motivos ajenos al contenido por parte de Apple y/o Google, reclamado dentro de los 14 días posteriores a la compra.