Control de versión y actualización forzada para tu app de Replit
Tu app web de Replit se actualiza con cada publicación, pero la carcasa nativa que la rodea solo cambia cuando los usuarios instalan una nueva versión desde la tienda. Cuando una función nueva depende de una carcasa más reciente, o cuando los builds antiguos apuntan a una URL que vas a retirar, necesitas saber quién se ha quedado atrás. WebViewGold le pasa a tu app web la versión instalada; unas pocas líneas de código lo convierten en un banner discreto o en una pantalla de actualización obligatoria.
Desde $109 de pago único por plataforma, o deja que nuestro equipo lo haga todo desde $698.
Garantía de aprobación – o te devolvemos el dinero en 14 días
Sin programar
Pago único, actualizaciones gratuitas
Soporte humano 24/7
Hecho en Alemania desde 2014 · ISO 27001
9:41
RReplit
Actualización forzada y control de versiónYa en tu bolsillo
App Store · Google Play Aprobada
Cuándo una versión antigua de la app causa problemas de verdad
Los despliegues web llegan a todas las versiones instaladas en la siguiente carga de página. Solo los cambios en la carcasa nativa dejan atrás a los usuarios, y estos son los tres que importan:
Una función web necesita una carcasa más reciente
Activas las compras in-app, el inicio de sesión biométrico o un nuevo proveedor de push en la versión 1.3. Los usuarios de la 1.2 ven el botón, pero el esquema de URL que hay detrás no hace nada en su build. Oculta o sustituye la función en las versiones antiguas.
El build antiguo carga una URL que vas a retirar
La URL de inicio está compilada dentro de la app. Pasar de un subdominio de la herramienta a tu propio dominio, o a un nuevo hosting, deja las instalaciones antiguas en la dirección vieja. Mantén una redirección y usa el control de versión para llevar a la gente al nuevo build.
Un cambio incompatible en el backend o el inicio de sesión
Cambias de proveedor de autenticación, de dominios de redirección de OAuth o de gestión de enlaces, y solo el nuevo build tiene los ajustes nativos correspondientes (Social Login Helper, Universal Links, listas de URLs). Una pantalla de actualización es más amable que un inicio de sesión que falla sin decir nada.
Prompt para Replit
Pega esto en Replit para implementar la parte de la web app. Revisa el resultado, publica y luego prueba dentro de la app WebViewGold.
Prompt para pegar en Replit Agent
Esta app funciona dentro del envoltorio nativo WebViewGold. Su user agent contiene "WebViewGold-iOS" o "WebViewGold-Android", y la variable global de JavaScript versionNumber contiene la versión instalada de la app.
1. Crea una tabla de Postgres app_versions (platform, minimum, latest, store_url) con filas para ios y android.
2. Añade GET /api/app-version?platform=ios|android&version=X, que devuelva esa fila con Cache-Control: no-store y registre la plataforma y la versión recibida para estadísticas.
3. En el cliente React, añade checkAppVersion(), que solo se ejecute dentro de la app, espere hasta 3 segundos a versionNumber, llame al endpoint con un tiempo de espera de 4 segundos y compare las versiones numéricamente.
4. Por debajo de la mínima: una página a pantalla completa de Actualización necesaria con un motivo, un botón a la tienda y un contacto de soporte. Por debajo de la última: un banner que se pueda cerrar.
5. Si se agota el tiempo de espera, hay errores, falta la variable o se abre en un navegador, renderiza la app con normalidad.
¡Una forma estupenda de convertir tu web app en una app nativa! Entrega rápida y una manera genial de llevar tus apps a las tiendas sin tener que desarrollar una app nativa completa.
Kevin Joling · FlightConnections & TrainConnections · Trustpilot
Cómo funciona el control de versión de WebViewGold
El lado nativo solo informa de la versión; la regla vive en tu backend.
Expón la versión a tu app web
Pon autoInjectVariable en true en Config.swift y AUTO_INJECT_VARIABLES en true en Config.java. WebViewGold proporciona entonces versionNumber (la versión que ven los usuarios, como 1.4.0) y bundleNumber (el número de build) como variables de JavaScript. Sin la inyección automática, navega una vez a getappversion:// y lee las mismas variables.
Publica una regla de versión desde tu backend
Guarda en tu backend la versión mínima admitida y la última versión por plataforma: una tabla pequeña, un archivo JSON o una entrada de configuración remota. Así, cambiar la regla no requiere una publicación en la tienda, y lo ideal es que ni siquiera requiera un despliegue.
Compara numéricamente, no como texto
Como cadenas de texto, "1.10.0" queda antes que "1.9.0". Divide por los puntos y compara cada parte como número, o compara números de build si los mantienes como enteros simples y crecientes.
Sugiere o bloquea
Por debajo de la última versión: un banner que se puede cerrar. Por debajo de la mínima: una página a pantalla completa de "Actualización necesaria" con un único botón a la ficha de la tienda. En un navegador normal, o cuando la versión es desconocida, no muestres nada.
Abre la app de la tienda, no una página web de la tienda
Enlaza a https://apps.apple.com/app/idYOUR_APPLE_ID y https://play.google.com/store/apps/details?id=your.package.name, y añade apps.apple.com y play.google.com a los hosts que siempre salen de la app (safariwhitelist en iOS, BROWSER_WHITELIST en Android), para que el sistema abra la App Store o Play Store en lugar de una página web dentro del WebView.
El control de versión en JavaScript
Llámalo una vez tras el primer renderizado en tu app de Replit. Espera brevemente a la variable inyectada, deja pasar al usuario ante cualquier error (fail open) y solo bloquea cuando tu backend lo indica. Usa tokens de user agent distintos por plataforma, por ejemplo "WebViewGold-iOS" en useragent_iphone / useragent_ipad y "WebViewGold-Android" en USER_AGENT:
javascript
const ua = navigator.userAgent;
const inApp = ua.includes("WebViewGold");
const platform = ua.includes("WebViewGold-Android") ? "android" : "ios";
function compareVersions(a, b) {
const pa = String(a).split(".").map(Number);
const pb = String(b).split(".").map(Number);
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
const d = (pa[i] || 0) - (pb[i] || 0);
if (d !== 0) return d < 0 ? -1 : 1;
}
return 0;
}
// autoInjectVariable / AUTO_INJECT_VARIABLES = true proporciona versionNumber;
// si no, asigna window.location.href = "getappversion://" una vez antes de consultar
function waitForVersion(ms = 3000) {
return new Promise((resolve) => {
const start = Date.now();
(function poll() {
if (typeof versionNumber !== "undefined") return resolve(String(versionNumber));
if (Date.now() - start > ms) return resolve(null);
setTimeout(poll, 100);
})();
});
}
async function checkAppVersion() {
if (!inApp) return; // navegador: nada que hacer
const installed = await waitForVersion();
if (!installed) return; // desconocida: dejar pasar
const rule = await fetch("/api/app-version?platform=" + platform)
.then((r) => (r.ok ? r.json() : null)).catch(() => null);
if (!rule) return; // backend inaccesible: dejar pasar
if (compareVersions(installed, rule.minimum) < 0) showUpdateRequired(rule.storeUrl);
else if (compareVersions(installed, rule.latest) < 0) showUpdateBanner(rule.storeUrl);
}
Regla de ejemplo: mínima 1.3.0, última 1.4.0
Instalada
Resultado
Lo que ve el usuario
1.4.0 o posterior
Al día
Nada
De 1.3.0 a 1.3.x
Por debajo de la última
Un banner que se puede cerrar: "Hay una nueva versión disponible"
1.2.x o anterior
Por debajo de la mínima
Una página a pantalla completa que explica el motivo, con un botón a la tienda y un contacto de soporte
Navegador, vista previa o versión desconocida
Sin datos
Nada: se deja pasar (fail open)
Errores que dejan a los usuarios fuera
Subir la versión mínima demasiado pronto. Espera a que el nuevo build esté publicado en ambas tiendas. Durante un lanzamiento por fases en Google Play, los usuarios que quedan fuera del porcentaje todavía no pueden obtener la actualización; la publicación por fases de Apple solo escalona las actualizaciones automáticas, así que los usuarios de iPhone pueden actualizar manualmente desde el primer momento.
Bloquear el build que está en revisión. App Review instala tu build más reciente, así que una comparación correcta nunca lo bloquea. Una con errores (comparación de cadenas, detección de plataforma incorrecta) le muestra al revisor un callejón sin salida y provoca un rechazo por la directriz 2.1.
Bloquear ante errores. Si falta la variable, la petición agota el tiempo de espera o el teléfono está sin conexión, deja entrar al usuario. Un muro de actualización que aparece por error es peor que una versión antigua.
Usarlo para cambios web. Los despliegues web ya llegan a todos. Solo los cambios nativos justifican una actualización; consulta qué requiere una actualización en la tienda.
Sin explicación. Una frase sobre por qué importa la actualización y un contacto de soporte funcionan mejor que un simple "Actualizar ahora", y la pantalla no debe esconderse detrás de un inicio de sesión.
Preguntas frecuentes
¿WebViewGold fuerza las actualizaciones por sí solo?
No. WebViewGold le indica a tu app web qué versión está instalada (getappversion:// o las variables inyectadas automáticamente versionNumber y bundleNumber). La decisión y la pantalla de actualización viven en tu app web, así que puedes cambiar la regla en cualquier momento sin publicar en la tienda.
¿Necesito actualizaciones forzadas si mi app web se actualiza al instante?
Normalmente no. La mayoría de los cambios llegan a todos los usuarios en la siguiente carga de página. El control de versión importa para los cambios nativos: nuevas funciones nativas, una nueva URL de inicio o un nuevo dominio, cambios en la gestión de enlaces o en los ajustes de inicio de sesión. A muchas apps les basta siempre con el banner discreto.
¿Apple y Google permiten una pantalla de actualización?
Ninguna de las dos tiendas prohíbe pedir a los usuarios que actualicen, y muchas apps grandes lo hacen. Asegúrate de que el build en revisión nunca quede bloqueado, explica con honestidad por qué hace falta la actualización y enlaza solo a tu propia ficha en la tienda.
¿Puedo usar el diálogo de actualización in-app de Google Play?
Google ofrece una API nativa de actualizaciones in-app para apps de Android, pero no forma parte del puente JavaScript documentado de WebViewGold. El control de versión más un enlace a Play Store funciona igual en ambas plataformas y mantiene un único camino de código.
¿Cómo pruebo la pantalla de actualización?
Sube temporalmente en tu backend la versión mínima por encima de tu build de TestFlight o de prueba interna, abre la app, revisa la pantalla y el botón de la tienda, y vuelve a dejarla como estaba. Abre también el sitio en un navegador normal: ahí no debe aparecer nunca esa pantalla.
Tres formas de llevar tu app a las tiendas
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.
Hazlo tú mismo
$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.
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.
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.
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.