__CAPGO_KEEP_0__ - Actualizaciones en vivo para aplicaciones __CAPGO_KEEP_1__

Versionamiento de destino

Esta guía explica cómo entregar automáticamente el último paquete compatible a los usuarios en función de su versión nativa de la aplicación. de manera similar a la aproximación de Ionic AppFlow. Esto garantiza un manejo de actualizaciones simplificado y lanzamientos más rápidos, mientras se evitan problemas de compatibilidad.

Capgo’s sistema de versión de destino permite que usted:

  • Entrega automáticamente actualizaciones compatibles a los usuarios según su versión nativa de la aplicación
  • Prevenga cambios que rompen la aplicación de llegar a versiones de la aplicación incompatibles
  • Administre múltiples versiones de la aplicación simultáneamente sin lógica compleja
  • Implemente actualizaciones de manera fluida a segmentos específicos de usuarios

¿Por qué la versión de destino es importante (sobre todo para usuarios de AppFlow)?

Sección titulada “Por qué es importante el objetivo de versión (sobre todo para usuarios de AppFlow)”

Si estás familiarizado con Ionic AppFlow, sabrás cuán crítico es asegurarse de que los usuarios reciban solo actualizaciones compatibles. AppFlow automatizó la coincidencia de paquetes de actualizaciones en vivo con versiones nativas de la aplicación, evitando que se entregara JavaScript incompatible a versiones nativas antiguas code.

Capgo ofrece las mismas garantías de seguridad, con características adicionales:

  • Más control granular sobre la coincidencia de versiones
  • Múltiples estrategias (canales, semver, restricciones nativas)
  • Mejor visibilidad en la distribución de versiones
  • API y CLI controlan junto con la gestión de la consola

Esta aproximación es particularmente útil cuando:

  • Tienes usuarios en diferentes versiones principales de tu aplicación (por ejemplo, v1.x, v2.x, v3.x)
  • Deben mantener la compatibilidad hacia atrás mientras lanzan cambios que rompen
  • Quieren evitar que los paquetes más nuevos rompan las versiones nativas más antiguas code
  • Están migrando a los usuarios gradualmente de una versión a otra
  • Están migrando desde AppFlow y quieren mantener la misma seguridad de actualización

Capgo utiliza un enfoque multiestratificado para emparejar a los usuarios con actualizaciones compatibles:

  1. Restricciones de Versión Nativa: Evitar que los paquetes se entreguen a versiones nativas incompatibles
  2. Ruteo Basado en Canal: Ruta diferentes versiones de la aplicación a diferentes canales de actualización
  3. Control de Semántica de Versión: Bloquear automáticamente actualizaciones a lo largo de los límites de versión mayor/minor/patch
  4. Sobrescrituras de Nivel de Dispositivo: Dirigir actualizaciones a dispositivos o grupos de usuarios específicos
graph TD
A[User Opens App] --> B{Check Device Override}
B -->|Override Set| C[Use Override Channel]
B -->|No Override| D{Check local plugin channel}
D -->|setChannel value| E[Use local setChannel channel]
D -->|No local channel| F{Check defaultChannel in App}
F -->|Has defaultChannel| G[Use App's defaultChannel]
F -->|No defaultChannel| H[Use Cloud Default Channel]
C --> I{Check Version Constraints}
E --> I
G --> I
H --> I
I -->|Compatible| J[Deliver Update]
I -->|Incompatible| K[Skip Update]

Esta es la enfoque recomendado para gestionar cambios de versión importantes y actualizaciones de versión mayor. Es similar al modelo de entrega de AppFlow.

  • App v1.x (100,000 usuarios) → production canal
  • App v2.x (50,000 usuarios con cambios de ruptura) → v2 canal
  • App v3.x (10,000 usuarios beta) → v3 canal

Paso 1: Configure los canales para cada versión mayor

Sección titulada “Paso 1: Configure los canales para cada versión mayor”
// capacitor.config.ts for version 1.x builds
import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.example.app',
appName: 'Example App',
plugins: {
CapacitorUpdater: {
autoUpdate: 'atBackground',
defaultChannel: 'production', // or omit for default
}
}
};
export default config;
// capacitor.config.ts for version 2.x builds
const config: CapacitorConfig = {
appId: 'com.example.app',
appName: 'Example App',
plugins: {
CapacitorUpdater: {
autoUpdate: 'atBackground',
defaultChannel: 'v2', // Routes v2 users automatically
}
}
};
// capacitor.config.ts for version 3.x builds
const config: CapacitorConfig = {
appId: 'com.example.app',
appName: 'Example App',
plugins: {
CapacitorUpdater: {
autoUpdate: 'atBackground',
defaultChannel: 'v3', // Routes v3 users automatically
}
}
};
Ventana de terminal
# Create channels for each major version
npx @capgo/cli channel create production
npx @capgo/cli channel create v2
npx @capgo/cli channel create v3
# Enable self-assignment so apps can switch channels
npx @capgo/cli channel set production --self-assign
npx @capgo/cli channel set v2 --self-assign
npx @capgo/cli channel set v3 --self-assign
Ventana de terminal
# For v1.x users (from v1-maintenance branch)
git checkout v1-maintenance
npm run build
npx @capgo/cli bundle upload --channel production
# For v2.x users (from v2-maintenance or main branch)
git checkout main
npm run build
npx @capgo/cli bundle upload --channel v2
# For v3.x users (from beta/v3 branch)
git checkout beta
npm run build
npx @capgo/cli bundle upload --channel v3
  • Sin cambios code - El ruteo de canales ocurre automáticamente
  • Separación clara - Cada versión tiene su propio pipeline de actualizaciones
  • Flexibilidad de destino - Actualiza a grupos de versiones específicas
  • Despliegue seguro - Cambios importantes nunca llegan a versiones incompatibles

Utilice los controles de versión semántica integrados de Capgo para evitar actualizaciones a través de límites de versión. Deshabilitar Actualización Automática a Versión Mayor

Sección titulada “Deshabilitar Actualización Automática a Versión Mayor”

Ventana de terminal
Estrategia 2: Controles de versión semántica para evitar actualizaciones a través de límites de versión.
# Create a channel that blocks major version updates
npx @capgo/cli channel create stable --disable-auto-update major

Esta configuración significa:

  • Los usuarios de la versión de la aplicación 1.2.3 recibirán actualizaciones hasta 1.9.9
  • Los usuarios recibirán NO la versión 2.0.0 automáticamente
  • Evita que los cambios de rompimiento lleguen a las versiones nativas antiguas code
  • La comparación utiliza la base nativa enviada como version_build
Ventana de terminal
# Block target bundles outside the native major.minor line (1.2.x won't get 1.3.0)
npx @capgo/cli channel set stable --disable-auto-update minor
# Block target bundles outside the exact native MAJOR.MINOR.PATCH core (1.2.3 won't get 1.2.4)
npx @capgo/cli channel set stable --disable-auto-update patch
# Allow all updates
npx @capgo/cli channel set stable --disable-auto-update none

Establece requisitos de versión nativa mínimos para los paquetes para evitar la entrega a dispositivos incompatibles.

Usando la condición de retraso de versión nativa

Sección titulada “Usando nativeVersion Delay Condition”

Cuando subas un paquete, puedes especificar una versión nativa mínima:

Ventana de terminal
# This bundle requires native version 2.0.0 or higher
npx @capgo/cli bundle upload \
--channel production \
--native-version "2.0.0"
  1. Se requiere un nuevo plugin nativo

    Ventana de terminal
    # Bundle needs Camera plugin added in v2.0.0
    npx @capgo/cli bundle upload --native-version "2.0.0"
  2. Rompiendo cambios nativos API

    Ventana de terminal
    # Bundle uses new Capacitor 6 APIs
    npx @capgo/cli bundle upload --native-version "3.0.0"
  3. Migración gradual

    Ventana de terminal
    # Test bundle only on latest native version
    npx @capgo/cli bundle upload \
    --channel beta \
    --native-version "2.5.0"

Evitar que los usuarios reciben paquetes más antiguos que su versión nativa actual.

En la consola de Capgo:

  1. Ir a Canales → Selecciona tu canal
  2. Habilitar “Deshabilitar la actualización automática nativa”
  3. Guardar cambios

O vía CLI:

Ventana de terminal
npx @capgo/cli channel set production --disable-downgrade
  • Dispositivo del usuario: Versión nativa 1.2.5
  • Paquete de canal: Versión 1.2.3
  • Resultado: La actualización está bloqueada (sería una actualización a una versión anterior)

Esto es útil cuando:

  • Los usuarios instalaron manualmente una versión más nueva desde la tienda de aplicaciones
  • Necesitas asegurarte de que los usuarios siempre tengan las últimas actualizaciones de seguridad
  • Quieres prevenir errores de regresión

Sobreescribir la asignación de canales para dispositivos o grupos de usuarios específicos

import { CapacitorUpdater } from '@capgo/capacitor-updater'
// Force beta testers to use v3 channel
async function assignBetaTesters() {
const deviceId = await CapacitorUpdater.getDeviceId()
// Check if user is beta tester
if (isBetaTester(userId)) {
await CapacitorUpdater.setChannel({ channel: 'v3' })
}
}

En el panel de control Capgo:

  1. Ir a Dispositivos → Encontrar dispositivo
  2. Hacer clic Establecer canal o Establecer versión
  3. Sobreescribir con una versión de canal o paquete específica
  4. El dispositivo recibirá actualizaciones desde una fuente sobrescrita

Aquí hay un ejemplo completo que combina todas las estrategias:

Ventana de terminal
# Create production channel with semver controls
npx @capgo/cli channel create production \
--disable-auto-update major \
--disable-downgrade
capacitor.config.ts
const config: CapacitorConfig = {
plugins: {
CapacitorUpdater: {
autoUpdate: 'atBackground',
defaultChannel: 'production',
}
}
};
Ventana de terminal
# Create v2 channel for new version
npx @capgo/cli channel create v2 \
--disable-auto-update major \
--disable-downgrade \
--self-assign
# Create git branch for v1 maintenance
git checkout -b v1-maintenance
git push origin v1-maintenance
// capacitor.config.ts for v2.0.0
const config: CapacitorConfig = {
plugins: {
CapacitorUpdater: {
autoUpdate: 'atBackground',
defaultChannel: 'v2', // New users get v2 channel
}
}
};
Ventana de terminal
# Update v1.x users (bug fix)
git checkout v1-maintenance
# Make changes
npx @capgo/cli bundle upload \
--channel production \
--native-version "1.0.0"
# Update v2.x users (new feature)
git checkout main
# Make changes
npx @capgo/cli bundle upload \
--channel v2 \
--native-version "2.0.0"

Utilice la consola de Capgo para seguir:

  • ¿Cuántos usuarios están en v1 vs v2
  • Tasa de adopción de paquetes por versión
  • Errores o fallas por versión

Una vez que la utilización de v1 caiga por debajo del umbral:

Ventana de terminal
# Stop uploading to production channel
# Optional: Delete v1 maintenance branch
git branch -d v1-maintenance
# Move all remaining users to default
# (They'll need to update via app store)

Cuando existan múltiples configuraciones de canal, Capgo utiliza este orden de precedencia:

  1. Dispositivo de Override (Panel o API) - Mayor prioridad y visible en el dispositivo de override de UI
  2. Canales de plugin local a través de setChannel() - Almacenado solo en el dispositivo y no se muestra en la UI de override de dispositivo
  3. canal predeterminado en capacitor.config.ts
  4. Canal Predeterminado (Configuración de Cloud) - Prioridad más baja

1. Establecer siempre defaultChannel para versiones principales

Sección titulada “1. Establecer siempre defaultChannel para versiones principales”
// ✅ Good: Each major version has explicit channel
// v1.x → production
// v2.x → v2
// v3.x → v3
// ❌ Bad: Relying on dynamic channel switching
// All versions → production, switch manually
Ventana de terminal
# ✅ Good
1.0.0 1.0.1 1.1.0 2.0.0
# ❌ Bad
1.0 1.1 2 2.5
Ventana de terminal
# ✅ Good: Separate branches per major version
main (v3.x)
v2-maintenance (v2.x)
v1-maintenance (v1.x)
# ❌ Bad: Single branch for all versions
Ventana de terminal
# Test on beta channel first
npx @capgo/cli bundle upload --channel beta
# Monitor for issues, then promote to production
npx @capgo/cli bundle upload --channel production

Regularly check your dashboard:

  • ¿Los usuarios están actualizando a versiones nativas más nuevas?
  • ¿Las versiones antiguas siguen recibiendo un alto tráfico?
  • ¿Deberías deprecate los canales antiguos?

Para equipos que están migrando desde Ionic AppFlow, aquí está cómo la versión de Capgo se compara con la versión de Ionic AppFlow:

CaracterísticaIonic AppFlowCapgo
Ruta basada en versionesAutomática según la versión nativaAutomática a través de defaultChannel + estrategias múltiples
Semántica de versionesSoporte básicoAvanzado con --disable-auto-update (mayor/minor/patch)
Restricciones de versión nativaConfiguración manual en la consola de AppFlowIntegrado --native-version bandera en CLI
Administración de canalesInterfaz de usuario web + CLIInterfaz de usuario web + CLI + API
Superposiciones de dispositivosControl limitado a nivel de dispositivoControl total a través de la consola/API
Prevención de descargas automáticasSí a través de --disable-downgrade
Mantenimiento de varias versionesGestión de rama y canal manualAutomatizado con prioridad de canal
AutogestiónNoSí (control total)
Análisis de versionesBásicoMétricas detalladas por versión

Los usuarios no están recibiendo actualizaciones

Sección titulada “Los usuarios no están recibiendo actualizaciones”

Verifique lo siguiente:

  1. Asignación de canal: Verifique que el dispositivo esté en el canal correcto

    const channel = await CapacitorUpdater.getChannel()
    console.log('Current channel:', channel)
  2. Restricciones de versión: Verifique si el paquete tiene requisitos de versión nativa

    • Panel de control → Paquetes → Verifique la columna “Versión nativa”
  3. Configuración de Semver: Verifique las configuraciones del canal disable-auto-update Configuración

    Ventana de terminal
    npx @capgo/cli channel list
  4. Override de dispositivo: Verificar si el dispositivo tiene un override manual

    • Panel de control → Dispositivos → Buscar dispositivo → Verificar canal/version
  1. Revisar defaultChannel: Asegurarse de que el canal esté correcto en capacitor.config.ts
  2. Verificar carga de bundle: Verificar si el bundle se subió al canal deseado
  3. Ver Versión Nativa: Confirmar --native-version se utilizó la bandera correctamente
  1. Solución Inmediata: Sobreescribir dispositivos afectados a paquete seguro
    • Panel de control → Dispositivos → Selección en bloque → Establecer Versión
  2. Solución a Largo Plazo: Crear canales versionados y mantener ramas separadas
  3. Prevención: Siempre probar actualizaciones en dispositivos representativos antes de la implementación

Si estás migrando desde Ionic AppFlow, la versión objetivo funciona muy de manera similar en Capgo, con mayor flexibilidad:

Concepto de AppFlowCapgo EquivalenteNotas
Canales de DespliegueCapgo CanalMismo concepto, más poderoso
Versión nativa bloqueada--native-version flagMás control granular
Prioridad de canalPrecedencia de canal (sobreescribir → en la nube → por defecto)Precedencia más transparente
Objetivo de despliegueCanal + semver controlaDisponibles varias estrategias
Canal de producciónproduction canal (o cualquier nombre)Nomenclatura flexible
Despliegue basado en GitCLI carga de paquete desde ramaMismo flujo de trabajo
Compatibilidad automática de versionesdefaultChannel Restricciones de versión +Mejorado con múltiples estrategias
  1. Más control: Capgo te da múltiples estrategias (canales, semver, versión nativa) que se pueden combinar
  2. Visibilidad mejorada: Dashboard muestra distribución de versiones y problemas de compatibilidad
  3. API Acceso: Control total programático sobre la versión objetivo
  4. Auto-hospedaje: Opción para ejecutar su propio servidor de actualizaciones con la misma lógica de versión
  1. Mapa sus canales de AppFlow a los canales Capgo (usualmente 1:1)
  2. Configuración defaultChannel en capacitor.config.ts para cada versión mayor
  3. Configura reglas de semver si deseas bloqueo automático en límites de versión
  4. Subir conjuntos de versiones específicas usando --native-version flag
  5. Monitorear distribución de versiones en panel de control Capgo
// Gradually migrate v1 users to v2
async function migrateUsers() {
const deviceId = await CapacitorUpdater.getDeviceId()
const rolloutPercentage = 10 // Start with 10%
// Hash device ID to get deterministic percentage
const hash = hashCode(deviceId) % 100
if (hash < rolloutPercentage) {
// User is in rollout group - migrate to v2
await CapacitorUpdater.setChannel({ channel: 'v2' })
}
}
// Enable features based on native version
async function checkFeatureAvailability() {
const info = await CapacitorUpdater.getDeviceId()
const nativeVersion = info.nativeVersion
if (compareVersions(nativeVersion, '2.0.0') >= 0) {
// Enable features requiring v2.0.0+
enableNewCameraFeature()
}
}
// Run A/B tests within same native version
async function assignABTest() {
const nativeVersion = await getNativeVersion()
if (nativeVersion.startsWith('2.')) {
// Only A/B test on v2 users
const variant = Math.random() < 0.5 ? 'v2-test-a' : 'v2-test-b'
await CapacitorUpdater.setChannel({ channel: variant })
}
}

Capgo ofrece varias estrategias para la entrega de actualizaciones específicas de versión:

  1. Ruta basada en canales: Separación automática de versiones mediante defaultChannel
  2. Gestión de versiones semánticas: Evita actualizaciones a través de fronteras de versión mayor/minor/patch
  3. Restricciones de versión nativa: Requiere una versión nativa mínima para paquetes
  4. Prevención de descenso automático: Nunca entrega paquetes más antiguos a versiones nativas más nuevas
  5. Oversight de dispositivo: Control manual para pruebas y targeting

Al combinar estas estrategias, puedes lograr la entrega automática de actualizaciones con estilo de AppFlow, con aún más flexibilidad y control. Elige el enfoque que mejor se adapte a la versión y el flujo de despliegue de tu aplicación.

Más detalles sobre características específicas:

Si estás utilizando Configuración de versión para planificar la ruta de los canales y la implementación en etapas, conecta con ella Canales para el detalle de implementación en Canales, Canales para el detalle de implementación en Canales, Canales para el detalle de implementación en Canales, Solución de Pruebas Beta para el flujo de trabajo del producto en Solución de Pruebas Beta, y Solución de Alcance de Versión para el flujo de trabajo del producto en Solución de Alcance de Versión.