Entendiendo las actualizaciones en vivo en Capgo
Las actualizaciones en vivo son una de las características más poderosas en las aplicaciones Capacitor, permitiendo actualizaciones en tiempo real sin envíos a las tiendas de aplicaciones. Profundicemos en cómo Capgo implementa esta funcionalidad.
Conceptos Fundamentales
Una aplicación Capacitor consiste en dos capas principales:
- Capa Web: Contiene archivos HTML, CSS y JavaScript cargados en el WebView
- Capa Nativa: Contiene código específico de la plataforma (Java/Kotlin para Android, Swift para iOS)
El sistema de actualización en vivo de Capgo funciona reemplazando la capa web en tiempo de ejecución, ya que estos archivos no están compilados en el binario de la aplicación.
Implementación Técnica
Rutas del Servidor en Capacitor
Capgo gestiona dos rutas críticas:
- Ruta Actual del Servidor: Apunta a los archivos actualmente cargados en WebView
- Ruta Siguiente del Servidor: Apunta a los archivos que se cargarán en el próximo reinicio de la aplicación
Implementación en Android
En Android, Capgo gestiona las rutas a través de:
// Store next server pathprivate 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 reloadprivate void setCurrentCapacitorServerPath(String path) { bridge.setServerBasePath(path); bridge.reload();}
Implementación en iOS
En iOS, las rutas se gestionan a través de:
// Store next server pathprivate func setNextCapacitorServerPath(path: String) { KeyValueStore.standard["serverBasePath"] = path}
// Update current pathprivate func setCurrentCapacitorServerPath(path: String) { bridge.viewController.setServerBasePath(path: path)}
Medidas de Seguridad
Capgo implementa seguridad de grado militar a través de cifrado de extremo a extremo, asegurando que las actualizaciones de tu aplicación permanezcan completamente seguras desde el desarrollo hasta el despliegue. Nuestro sistema de cifrado va más allá de la firma de código tradicional para proporcionar verdadera seguridad de conocimiento cero.
Arquitectura de Cifrado de Extremo a Extremo
-
Cifrado de Extremo a Extremo (E2EE): Cada paquete de actualización se cifra utilizando cifrado AES-256-GCM antes de salir de tu entorno de desarrollo. Este cifrado de grado militar asegura que las actualizaciones de tu aplicación permanezcan completamente privadas y seguras durante todo el proceso de entrega.
-
Arquitectura de Conocimiento Cero: A diferencia de otras soluciones OTA que solo firman actualizaciones, Capgo emplea verdadero cifrado de conocimiento cero. Esto significa:
- El contenido de las actualizaciones se cifra antes de la carga
- Los servidores de Capgo solo almacenan datos cifrados
- El descifrado solo ocurre en los dispositivos de usuarios finales
- Ningún intermediario puede acceder al contenido de tu actualización
-
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 aplicación puede usar claves de cifrado únicas
- Soporte para rotación de claves para mayor seguridad
Aprende más sobre nuestro sistema de cifrado en nuestra guía detallada: End-to-End Encryption in Capgo Live Updates
Proceso de Seguridad de Actualizaciones
-
Cifrado Pre-Carga:
- Las actualizaciones se cifran en tu pipeline CI/CD
- Cada archivo se cifra individualmente
- Los metadatos también se cifran para privacidad completa
-
Almacenamiento Seguro:
- Los paquetes cifrados se almacenan en el CDN global de Capgo
- Ningún dato en texto plano toca nuestros servidores
- Incluso en caso de violación del servidor, los datos permanecen seguros
-
Entrega Segura:
- Las actualizaciones se entregan a través de canales cifrados
- Cada instancia de la aplicación valida la integridad del cifrado
- Mecanismos automáticos de reintento para descifrados fallidos
-
Seguridad del Lado del Cliente:
- Las actualizaciones se verifican antes de la instalación
- Los descifrados fallidos activan reversión automática
- Almacenamiento seguro de claves en el almacenamiento protegido de la aplicación
Este enfoque integral de seguridad asegura que las actualizaciones de tu aplicación permanezcan protegidas contra:
- Ataques de intermediarios
- Violaciones del lado del servidor
- Modificaciones no autorizadas
- Ataques de repetición
- Manipulación de contenido
Ciclo de Vida de Actualización
El proceso de actualización de Capgo está diseñado para ser automático por defecto. Así es como funciona el proceso automático:
1. Verificación Automática de Actualizaciones
El plugin verifica automáticamente las actualizaciones en estas situaciones:
- Cuando la aplicación inicia
Este comportamiento está controlado por la configuración autoUpdate
:
// capacitor.config.json{ "plugins": { "CapacitorUpdater": { "autoUpdate": true // Enable automatic updates } }}
También puedes verificar manualmente con getLatest()
2. Descarga Automática
Cuando se detecta una nueva versión, si autoUpdate
está habilitado:
- La descarga comienza automáticamente
- El progreso se rastrea internamente
- Las descargas fallidas se reintentan automáticamente en cada apertura de la aplicación 4.Las descargas exitosas se almacenan en el almacenamiento de la aplicación
Puedes monitorear este proceso a través de 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 verdadero - En el siguiente paso a segundo plano de la app si
directUpdate
es falso - Auto-reversión si la instalación falla
El plugin también gestiona automáticamente el almacenamiento:
- Elimina actualizaciones fallidas si
autoDeleteFailed
es verdadero - Limpia versiones antiguas si
autoDeletePrevious
es verdadero
Retrasando Actualizaciones
Puedes controlar cuándo se instalan las actualizaciones usando condiciones de retraso:
// Delay until app goes to backgroundawait CapacitorUpdater.setDelay({ kind: 'background'});
// Delay until specific dateawait CapacitorUpdater.setDelay({ kind: 'date', value: '2024-03-20T10:00:00.000Z'});
// Delay until next native versionawait CapacitorUpdater.setDelay({ kind: 'nativeVersion'});
// Multiple conditionsawait CapacitorUpdater.setMultiDelay({ delayConditions: [ { kind: 'background' }, { kind: 'date', value: '2024-03-20T10:00:00.000Z' } ]});
Condiciones de retraso disponibles:
- background: Instalar cuando la app pase a segundo plano
- date: Instalar después de una fecha/hora específica
- nativeVersion: Instalar después de la próxima actualización nativa
- kill: Instalar después de que la app sea cerrada
Esto es útil para:
- Programar actualizaciones durante horas de bajo uso
- Coordinar actualizaciones con la actividad del usuario
- Asegurar una experiencia fluida de actualización
- Prevenir interrupciones durante tareas críticas
Estados de Actualización
Durante el proceso automático, los paquetes pasan por estos estados:
- downloading: Descarga en progreso
- pending: Descarga completa, esperando instalación
- success: Actualización instalada y activa
- error: Actualización fallida (activa auto-reversión)
Cumplimiento de las Tiendas
App Store de Apple ✅
Las Actualizaciones en Vivo cumplen totalmente con las políticas de la App Store de Apple. Como se establece en el Acuerdo de Licencia del Programa de Desarrolladores de Apple:
“El código interpretado puede descargarse en una Aplicación solo si dicho código: (a) no cambia el propósito principal de la Aplicación proporcionando características o funcionalidad inconsistentes con el propósito previsto y anunciado de la Aplicación según se envió a la App Store, (b) no crea una tienda o punto de venta para otro código o aplicaciones, y (c) no evita la firma, el sandbox u otras características de seguridad del SO”
Capgo solo modifica la capa web mientras respeta todos los límites de seguridad de la plataforma
Google Play Store ✅
Las Actualizaciones en Vivo cumplen con las Políticas de Google Play. La política de Abuso de Dispositivos y Red específicamente establece:
“Esta restricción no se aplica al código que se ejecuta en una máquina virtual o un intérprete donde cualquiera proporciona acceso indirecto a las APIs de Android (como JavaScript en un webview o navegador)”
Como Capgo solo actualiza el contenido de WebView, está dentro de estas pautas permitidas
Mejores Prácticas
- Implementaciones Graduales: Desplegar actualizaciones gradualmente
- Control de Versiones: Rastrear todas las versiones desplegadas
- Soporte de Reversión: Recuperación rápida de problemas
- Actualizaciones Delta: Solo descargar archivos modificados
Cuándo Usar Actualizaciones en Vivo
Perfecto para:
- Corrección de errores
- Mejoras de UI
- Actualizaciones de contenido
- Activación de funciones
No adecuado para:
- Cambios de código nativo
- Actualizaciones de versiones mayores
- Parches de seguridad que requieren cambios nativos