Saltar al contenido
WebViewGold Del vibe coding a la App Store
Español
Consigue WebViewGold

v0 + actualizaciones de la app

Control de versión y actualización forzada para tu app de v0

Tu app web de v0 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

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 v0

Pega esto en v0 para implementar la parte de la web app. Revisa el resultado, publica y luego prueba dentro de la app WebViewGold.

Prompt para pegar en v0
Esta app de Next.js con App Router funciona dentro del envoltorio nativo WebViewGold. Su user agent contiene "WebViewGold-iOS" o "WebViewGold-Android", y la variable global versionNumber contiene la versión instalada de la app tras la carga.
1. Crea app/api/app-version/route.ts que devuelva { minimum, latest, storeUrl } para ?platform=ios o ?platform=android, leído de Vercel Edge Config (claves appVersionIos y appVersionAndroid), con Cache-Control: no-store.
2. Crea un componente de cliente VersionGate en el layout raíz que solo se ejecute dentro de la app, espere hasta 3 segundos a versionNumber y compare las versiones numéricamente.
3. Por debajo de la mínima: renderiza una pantalla completa de Actualización necesaria con un motivo, un botón a storeUrl y un enlace de soporte. Por debajo de la última: un banner que se pueda cerrar.
4. Deja pasar al usuario ante cualquier error, y no renderices nada durante el renderizado en el servidor ni en un navegador normal.
5. Añade tests unitarios para la comparación de versiones, incluido 1.10.0 frente a 1.9.0.

¡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".

Nelis Geiger · CodeCanyon

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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 v0. 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

InstaladaResultadoLo que ve el usuario
1.4.0 o posteriorAl díaNada
De 1.3.0 a 1.3.xPor debajo de la últimaUn banner que se puede cerrar: "Hay una nueva versión disponible"
1.2.x o anteriorPor debajo de la mínimaUna 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 desconocidaSin datosNada: 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.

Ver planes en la página principal

Full Service

$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 de WeSetupYourWebViewApp

Precios de la Oferta de invierno válidos hasta el 31 de diciembre de 2026.

¿Listo para lanzar tu app de v0?

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.