Saltar al contenido principal

Cómo funcionan los Live Updates en Capgo

Análisis en profundidad de la implementación técnica de las actualizaciones en vivo en Capgo, comprendiendo cómo funciona internamente tanto en iOS como en Android.

Ilustración del blog de Capgo: «Cómo funcionan las Live Updates en Capgo»

Entender Live Updates en Capgo

live updates de Capacitor (OTA) reemplaza el bundle web dentro de tu app para que puedas publicar cambios en JavaScript, HTML y CSS sin necesidad de un nuevo binario de la tienda. Las actualizaciones en vivo son una de las funciones más potentes en las apps de Capacitor, permitiendo actualizaciones en tiempo real sin enviarlas a la tienda de aplicaciones. Vamos a profundizar en cómo Capgo implementa esta funcionalidad.

Conceptos clave

Una app de Capacitor consta de dos capas principales:

  1. Capa web: Contiene archivos HTML, CSS y JavaScript que se cargan en el WebView
  2. Capa nativa: Contiene code específico de la plataforma (Java/Kotlin para Android, Swift para iOS)

El sistema de live update de Capgo funciona reemplazando la capa web en tiempo de ejecución, ya que estos archivos no se compilan en el binario de la app.

Implementación técnica

Rutas de servidor en Capacitor

Capgo gestiona dos rutas críticas:

  • Ruta del servidor actual: Apunta a los archivos cargados actualmente en la WebView
  • Siguiente ruta del servidor: Apunta a los archivos que se cargarán al reiniciar la app

Implementación en Android

En Android, Capgo gestiona las rutas mediante:

// Store next server path
private void setNextCapacitorServerPath(String path) {
    SharedPreferences prefs = context.getSharedPreferences("CapWebViewSettings", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("serverBasePath", path);
    editor.apply();
}

// Update current path and reload
private void setCurrentCapacitorServerPath(String path) {
    bridge.setServerBasePath(path);
    bridge.reload();
}

Implementación en iOS

En iOS, las rutas se gestionan mediante:

// Store next server path
private func setNextCapacitorServerPath(path: String) {
    KeyValueStore.standard["serverBasePath"] = path
}

// Update current path
private func setCurrentCapacitorServerPath(path: String) {
    bridge.viewController.setServerBasePath(path: path)
}

Medidas de seguridad

Capgo implementa seguridad de nivel militar mediante cifrado de extremo a extremo, garantizando que las actualizaciones de tu app sean totalmente seguras desde el desarrollo hasta el despliegue. Nuestro sistema de cifrado va más allá de la firma code tradicional para ofrecer una verdadera seguridad zero-knowledge.

Arquitectura de cifrado de extremo a extremo

  1. Cifrado de extremo a extremo (E2EE): Cada bundle de actualización se cifra con AES-256-GCM antes de salir de tu entorno de desarrollo. Este cifrado de nivel militar garantiza que las actualizaciones de tu app se mantengan privadas y seguras durante todo el proceso de entrega.

  2. Arquitectura de conocimiento cero: A diferencia de otras soluciones de actualización OTA que solo firman las actualizaciones, Capgo emplea cifrado de conocimiento cero real. Esto significa:

    • El contenido de la actualización se cifra antes de subirse
    • Los servidores de Capgo solo almacenan datos cifrados
    • Decryption only happens on end-user devices
    • Ningún intermediario puede acceder al contenido de tu actualización
  3. Gestión segura de claves:

    • Las claves de cifrado se generan y almacenan de forma segura en tu entorno CI/CD
    • Las claves privadas nunca tocan los servidores de Capgo
    • Cada versión de la app puede usar claves de cifrado únicas
    • Soporte para rotación de claves para una seguridad mejorada

Más sobre nuestro sistema de cifrado en nuestra guía detallada: Cifrado de extremo a extremo en Capgo Live Updates

Proceso de seguridad de las actualizaciones

  1. Cifrado previo a la subida:

    • Las actualizaciones se cifran en tu pipeline de CI/CD
    • Cada archivo se cifra individualmente
    • Los metadatos también se cifran para una privacidad total
  2. Almacenamiento seguro:

    • Los bundles cifrados se almacenan en la CDN global de Capgo
    • Ningún dato en texto plano toca nuestros servidores
    • Incluso ante una brecha en el servidor, los datos siguen seguros
  3. Entrega segura:

    • Las actualizaciones se entregan mediante canales cifrados
    • Cada instancia de la app valida la integridad del cifrado
    • Reintentos automáticos ante fallos de descifrado
  4. Seguridad del lado del cliente:

    • Las actualizaciones se verifican antes de instalarse
    • El fallo de descifrado activa un rollback automático
    • Secure key storage in app’s protected storage

Este enfoque integral de seguridad garantiza que tus actualizaciones sigan protegidas contra:

  • Ataques man-in-the-middle
  • Brechas del lado del servidor
  • Modificaciones no autorizadas
  • Ataques de replay
  • Alteración de contenido

Ciclo de vida de actualizaciones

El proceso de actualización de Capgo está diseñado para ser automático por defecto. Así funciona el proceso automático:

1. Verificación automática de actualizaciones

El plugin busca actualizaciones automáticamente en estas situaciones:

  • Cuando la app se inicia

Este comportamiento se controla mediante la autoUpdate configuración:

// capacitor.config.json
{
  "plugins": {
    "CapacitorUpdater": {
      "autoUpdate": true // Enable automatic updates
    }
  }
}

También puedes verificarlo manualmente con getLatest()

2. Descarga automática

Cuando se detecta una nueva versión, si autoUpdate está activado:

  1. La descarga comienza automáticamente
  2. El progreso se rastrea internamente
  3. Las descargas fallidas se reintentan al abrir la app
  4. Las descargas exitosas se guardan en el almacenamiento de la app

Puedes monitorear este proceso mediante eventos:

CapacitorUpdater.addListener('download', (info: DownloadEvent) => {
  console.log('Auto-download progress:', info.percent);
});

CapacitorUpdater.addListener('downloadComplete', (info: DownloadCompleteEvent) => {
  console.log('Auto-download complete:', info.bundle);
});

3. Instalación automática

El momento de la instalación depende de tu configuración:

// capacitor.config.json
{
  "plugins": {
    "CapacitorUpdater": {
      "autoUpdate": true,
      "directUpdate": false // install update on app backgrounding
      "resetWhenUpdate": true, // reset live updates on native update (true by default)
      "autoDeleteFailed": true, // Auto cleanup failed updates (true by default)
      "autoDeletePrevious": true // Auto cleanup old versions (true by default)
    }
  }
}

La instalación ocurre:

  • Inmediatamente si directUpdate es true
  • Al pasar la app a segundo plano si directUpdate es false
  • Auto-rollback si la instalación falla

El plugin también gestiona el almacenamiento automáticamente:

  • Elimina las actualizaciones fallidas si autoDeleteFailed es true
  • Limpia las versiones antiguas si autoDeletePrevious es true

Retrasar actualizaciones

Puedes controlar cuándo se instalan las actualizaciones con condiciones de retraso:

// Delay until app goes to background
await CapacitorUpdater.setDelay({
  kind: 'background'
});

// Delay until specific date
await CapacitorUpdater.setDelay({
  kind: 'date',
  value: '2024-03-20T10:00:00.000Z'
});

// Delay until next native version
await CapacitorUpdater.setDelay({
  kind: 'nativeVersion'
});

// Multiple conditions
await CapacitorUpdater.setMultiDelay({
  delayConditions: [
    {
      kind: 'background'
    },
    {
      kind: 'date',
      value: '2024-03-20T10:00:00.000Z'
    }
  ]
});

Condiciones de retraso disponibles:

  • background: Instalar cuando la app pasa a segundo plano
  • date: Instalar después de una fecha/hora específica
  • nativeVersion: Instalar tras la próxima actualización nativa
  • kill: Instalar después de que la app se cierre

Esto es útil para:

  • Programar actualizaciones en horas valle
  • Coordinar actualizaciones con la actividad del usuario
  • Ensuring smooth update experience
  • Evitar interrupciones durante tareas críticas

Estados de actualización

Durante el proceso automático, los bundles transitan por estos estados:

  1. descargando: Descarga en curso
  2. pendiente: Descarga completada, esperando instalación
  3. correcto: Actualización instalada y activa
  4. error: La actualización falló (dispara rollback automático)

Cumplimiento con las tiendas

Apple App Store ✅

Live Updates cumple totalmente con las políticas de la App Store de Apple. Como se indica en el Acuerdo de Licencia del Programa de Desarrolladores de Apple:

“El code interpretado puede descargarse en una Aplicación, pero solo mientras dicho code: (a) no cambie el propósito principal de la Aplicación al ofrecer funciones o funcionalidad que no sean coherentes con el propósito previsto y anunciado de la Aplicación tal como se envió a la App Store, (b) no cree una tienda o escaparate para otros code o aplicaciones, y (c) no eluda el firmado, el sandbox u otras funciones de seguridad del SO.”

Las actualizaciones de Capgo solo modifican la capa web respetando todos los límites de seguridad de la plataforma.

Google Play Store ✅

Live Updates cumple con las políticas de Google Play. La política de Abuso de dispositivos y redes establece específicamente:

“Esta restricción no se aplica a code que se ejecute en una máquina virtual o un intérprete donde cualquiera de los dos proporcione acceso indirecto a las APIs de Android (como JavaScript en un WebView o navegador)”.

Como Capgo solo actualiza el contenido de la WebView, cumple con estas directrices permitidas.

Buenas prácticas

  1. Despliegues graduales: Despliega actualizaciones gradualmente
  2. Control de versiones: Rastrea todas las versiones desplegadas
  3. Soporte de rollback: Recuperación rápida ante problemas
  4. Actualizaciones delta: Solo descarga los archivos modificados

Cuándo usar Live Updates

Ideal para:

  • Bug fixes
  • Mejoras de UI
  • Actualizaciones de contenido
  • Feature toggles

No apto para:

  • Cambios nativos de code
  • Actualizaciones de versión mayor
  • Parches de seguridad que requieren cambios nativos

Sigue leyendo desde Cómo funcionan las Live Updates en Capgo

Si estás usando Cómo funcionan los Live Updates en Capgo para planificar el trabajo con plugins nativos, conéctalo con Directorio de plugins de Capgo para el flujo de trabajo del producto en Capgo Plugin Directory, Plugins de Capacitor por Capgo para el detalle de implementación en los Plugins de Capacitor por Capgo, Añadir o actualizar plugins para el detalle de implementación en Agregar o actualizar plugins, Alternativas a plugins de Ionic Enterprise para el flujo de trabajo en Alternativas a plugins de Ionic Enterprise, y Native Builds de Capgo para el flujo de trabajo del producto en Capgo Native Builds.

Live updates para apps Capacitor

Cuando un bug de la capa web está en producción, publica el fix a través de Capgo en lugar de esperar días a la aprobación de la app store. Los usuarios reciben la actualización en segundo plano mientras los cambios nativos siguen el flujo de revisión habitual.

Lo último de nuestro blog

Capgo te da la información clave que necesitas para crear una app móvil realmente profesional.