Saltare al contenuto

Targeta di versione

Questa guida spiega come consegnare automaticamente la versione bundle più recente compatibile agli utenti in base alla loro versione nativa dell'applicazione. simile all'approccio di Ionic AppFlow. Ciò garantisce una gestione semplificata degli aggiornamenti e una distribuzione più veloce, mentre evita problemi di compatibilità.

Capgo's sistema di targeting delle versioni consente di:

  • Consegnare automaticamente aggiornamenti compatibili ai utenti in base alla loro versione nativa dell'applicazione
  • Prevenire i cambiamenti di rotta che non raggiungono versioni di app incompatibili
  • Gestire diverse versioni di app contemporaneamente senza logica complessa
  • Rilasciare aggiornamenti senza soluzione di continuità a specifici segmenti di utenti

Perché la versione di targeting è importante (Soprattutto per gli utenti di AppFlow)

Sottosezione intitolata “Perché la versione di targeting è importante (Soprattutto per gli utenti di AppFlow)”

Se siete familiarizzati con Ionic AppFlow, sapete quanto sia critico assicurare che gli utenti ricevano solo aggiornamenti compatibili. AppFlow ha automaticamente corrisposto i pacchetti di aggiornamento live alle versioni native dell'applicazione, impedendo che il JavaScript incompatibile fosse consegnato alle versioni native più vecchie code.

Capgo garantisce le stesse garanzie di sicurezza, con funzionalità aggiuntive:

  • Maggiore controllo sul matching delle versioni
  • Strategie multiple (canali, semver, vincoli nativi)
  • Migliore visibilità sulla distribuzione delle versioni
  • API e CLI controllano insieme la gestione del pannello

Questa approccio è particolarmente utile quando:

  • Hai utenti su diverse versioni maggiori del tuo app (ad esempio, v1.x, v2.x, v3.x)
  • Hai bisogno di mantenere la compatibilità all'indietro mentre rilasci cambiamenti breaking
  • Vuoi impedire che i bundle più recenti rompano le native code più vecchie
  • Stai migrando gli utenti gradualmente da una versione all'altra
  • Stai migrando da AppFlow e desidera mantenere la stessa sicurezza degli aggiornamenti

Capgo utilizza un approccio a strati multipli per abbinare gli utenti con aggiornamenti compatibili:

  1. Versioni native con restrizioni: Impedisce ai pacchetti di essere consegnati a versioni native incompatibili
  2. Routing basato sui canali: Inoltra diverse versioni dell'applicazione a diversi canali di aggiornamento
  3. Controlli di versioning semantico: Blocca automaticamente gli aggiornamenti tra i confini di versione maggiore/minore/patch
  4. Override del dispositivo: Collega specifici dispositivi o gruppi di utenti
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]

Estrategia 1: Routing delle versioni basato sul canale

Sezione intitolata “Estrategia 1: Routing delle versioni basato sul canale”

Questo è il approccio consigliato per la gestione delle modifiche di versione e degli aggiornamenti di versione maggiore. È simile al modello di consegna di AppFlow.

  • App v1.x (100.000 utenti) → production canale
  • App v2.x (50.000 utenti con modifiche di rottura) → v2 canale
  • App v3.x (10.000 utenti beta) → v3 canale

Passo 1: Configura i canali per ogni versione maggiore

Sezione intitolata “Passo 1: Configura i canali per ogni versione maggiore”
// 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
}
}
};
Finestra del terminale
# 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
Finestra del terminale
# 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
  • Zero cambiamenti code - La routing del canale avviene automaticamente
  • - Separazione chiara - Ogni versione ha il suo proprio flusso di aggiornamento
  • - Aggiornamenti push per gruppi di versioni specifiche - Eseguimenti sicuri
  • - Cambiamenti breaking non raggiungono versioni incompatibili - Cambiamenti breaking non raggiungono versioni incompatibili

Usa i controlli di versioning semantico integrati di Capgo per prevenire gli aggiornamenti tra i confini delle versioni. Disabilita l'Aggiornamento Automatico tra le Versioni Principali

Sezione intitolata “Disabilita l'Aggiornamento Automatico tra le Versioni Principali”

Fermata di comando
Copia negli appunti
# Create a channel that blocks major version updates
npx @capgo/cli channel create stable --disable-auto-update major

Gli utenti con la versione dell'app

  • riceveranno gli aggiornamenti fino a 1.2.3 versione __CAPGO_KEEP_0__ 1.9.9
  • Gli utenti riceveranno NON riceveranno versioni 2.0.0 automaticamente
  • Previene che i cambiamenti di versione che potrebbero rompere il codice raggiungano le versioni native precedenti code
  • La comparazione utilizza la linea di base nativa inviata come version_build
Finestra del terminale
# 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

Specificare una versione minima di app nativa (min_update_version) su ogni bundle in modo che Capgo lo consegni solo ai dispositivi che hanno un binario nativo abbastanza nuovo.

Questo utilizza la strategia di metadati del canale ( ) più i metadati--disable-auto-update metadatala strategia ( --min-update-version o --auto-min-update-version __CAPGO_KEEP_0__ --native-version CLI flag.

Sommario: Abilita la targeting dei metadati sul canale

Finestra del terminale
Copiare nel portapenna
# one-time: require min_update_version metadata on uploads to this channel
npx @capgo/cli@latest channel set production --disable-auto-update metadata

Sommario: Configura una versione nativa minima all'upload

Quando si carica un bundle, passa la versione nativa più bassa che possa riceverlo:

Finestra del terminale

Copiare nel portapenna
# This bundle requires native version 2.0.0 or higher
npx @capgo/cli@latest bundle upload \
--channel production \
--min-update-version "2.0.0"

Ora lascia Capgo stabilire il livello di base dalle compatibilità dei pacchetti nativi:

Finestra del terminale
npx @capgo/cli@latest bundle upload \
--channel production \
--auto-min-update-version
  1. Richiesta di plugin nativo nuovo

    Finestra del terminale
    # Bundle needs Camera plugin added in v2.0.0
    npx @capgo/cli@latest bundle upload \
    --channel production \
    --min-update-version "2.0.0"
  2. Modifiche native di versione API

    Finestra del terminale
    # Bundle uses new Capacitor 6 APIs
    npx @capgo/cli@latest bundle upload \
    --channel production \
    --min-update-version "3.0.0"
  3. Migrazione graduale

    Finestra del terminale
    # one-time: enable metadata gating on beta
    npx @capgo/cli@latest channel set beta --disable-auto-update metadata
    # Test bundle only on latest native version
    npx @capgo/cli@latest bundle upload \
    --channel beta \
    --min-update-version "2.5.0"

Prevenire agli utenti di ricevere pacchetti più vecchi della loro versione nativa corrente.

Nella dashboard Capgo:

  1. Vai a Canaletti Canale
  2. → Seleziona il tuo canale Abilita
  3. “Disabilita l'autoabbassamento sotto la versione nativa”

Or via CLI:

O via __CAPGO_KEEP_0__:
npx @capgo/cli@latest channel set production --no-downgrade
  • Dispositivo dell'utente: Versione nativa 1.2.5
  • Pacco del canale: Versione 1.2.3
  • Risultato: L'aggiornamento è bloccato (sarebbe una versione inferiore)

Questo è utile quando:

  • Gli utenti hanno installato manualmente una versione più recente dal negozio di app
  • Hai bisogno di assicurarti che gli utenti abbiano sempre le patch di sicurezza più recenti
  • Vuoi prevenire i bug di regressione

Sovrascrivi l'assegnazione del canale per dispositivi o gruppi di utenti specifici.

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' })
}
}

Nel Capgo pannello di controllo:

  1. Vai a Dispositivi → Trova dispositivo
  2. Clicca Aggiungi Canale o Aggiungi Canale
  3. o
  4. Aggiungi Versione

Flusso di lavoro completo AppFlow-Style

Sottosezione intitolata “Flusso di lavoro completo AppFlow-Style”

Sezione intitolata “1. Configurazione iniziale (App v1.0.0)”
Finestra del terminale
# Create production channel, then enable metadata min-version gating
npx @capgo/cli@latest channel add production
npx @capgo/cli@latest channel set production \
--disable-auto-update metadata \
--no-downgrade
capacitor.config.ts
const config: CapacitorConfig = {
plugins: {
CapacitorUpdater: {
autoUpdate: 'atBackground',
defaultChannel: 'production',
}
}
};
Finestra del terminale
# Create v2 channel for new version
npx @capgo/cli@latest channel add v2
npx @capgo/cli@latest channel set v2 \
--disable-auto-update metadata \
--no-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
}
}
};
Finestra del terminale
# Update v1.x users (bug fix)
git checkout v1-maintenance
# Make changes
npx @capgo/cli@latest bundle upload \
--channel production \
--min-update-version "1.0.0"
# Update v2.x users (new feature)
git checkout main
# Make changes
npx @capgo/cli@latest bundle upload \
--channel v2 \
--min-update-version "2.0.0"

Utilizza il Capgo dashboard per tracciare:

  • Quanti utenti sono su v1 rispetto a v2
  • Tassi di adozione dei bundle per versione
  • Errori o crash per versione

Una volta che l'utilizzo di v1 scende sotto il threshold:

Finestra del terminale
# 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)

Quando esistono più configurazioni di canale, Capgo utilizza questo ordine di precedenza:

  1. Override del dispositivo (Pannello di controllo o API) - Priorità più alta e visibile nel pannello di controllo dell'override del dispositivo
  2. Canale plugin locale via setChannel() - Memorizzato sul dispositivo solo e non mostrato nel pannello di controllo dell'override del dispositivo
  3. canalePredefinito in capacitor.config.ts
  4. Canale predefinito (Impostazione Cloud) - Priorità più bassa

1. Impostare sempre defaultChannel per le Versioni Maggiori

Sezione intitolata “1. Imposta sempre defaultChannel per le versioni maggiori”
// ✅ 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
Finestra del terminale
# ✅ Good
1.0.0 1.0.1 1.1.0 2.0.0
# ❌ Bad
1.0 1.1 2 2.5
Finestra del terminale
# ✅ Good: Separate branches per major version
main (v3.x)
v2-maintenance (v2.x)
v1-maintenance (v1.x)
# ❌ Bad: Single branch for all versions
Finestra del terminale
# one-time: create beta and enable metadata gating
# (production is set up in the complete workflow above)
npx @capgo/cli@latest channel add beta
npx @capgo/cli@latest channel set beta --disable-auto-update metadata
# Test on beta channel first
npx @capgo/cli@latest bundle upload \
--channel beta \
--auto-min-update-version
# Monitor for issues, then promote to production
npx @capgo/cli@latest bundle upload \
--channel production \
--auto-min-update-version

Controlla regolarmente il tuo pannello di controllo:

  • Gli utenti stanno aggiornando a versioni native più recenti?
  • Le vecchie versioni stanno ancora ricevendo un traffico elevato?
  • Dovresti deprecare i vecchi canali?

Per le squadre in transizione da Ionic AppFlowEcco come Capgo si differenzia per quanto riguarda la targeting delle versioni:

CaratteristicaIonic AppFlowCapgo
Targeting delle versioniRouting basato sulla versioneAutomatico in base alla versione nativa defaultChannel Automatico tramite
+ diverse strategieSemantic versioningSostegno base --disable-auto-update Avanzato con
Versioni native con vincoliConfigurazione manuale nel dashboard di AppFlowIntegrato --min-update-version / --auto-min-update-version con canali di metadati
Gestione dei canaliInterfaccia web + CLIInterfaccia web + CLI + API
Override del dispositivoControllo limitato a livello di dispositivoControllo completo tramite Dashboard/API
Prevenzione della discesa automaticaSì via --no-downgrade
Mantenimento multi-versioneGestione manuale di branch e canaliAutomatizzato con precedenza di canale
Hosting selfNoSì (controllo completo)
Analisi di versioneBasicoMetriche dettagliate per versione

Controlla i seguenti punti:

  1. Assegnazione del canale: Verifica che il dispositivo sia sul canale corretto

    const channel = await CapacitorUpdater.getChannel()
    console.log('Current channel:', channel)
  2. Vincoli di versione: Controlla se il bundle ha requisiti di versione native

    • Dashboard → Pacchetti → Controlla la colonna “Versione nativa”
  3. Impostazioni Semver: Verifica le impostazioni del canale disable-auto-update impostazione

    Fenestra del terminale
    npx @capgo/cli channel list
  4. Override dispositivo: Controlla se il dispositivo ha un override manuale

    • Dashboard → Dispositivi → Cerca dispositivo → Controlla canale/versione
  1. Verifica canale predefinito: Assicurati di avere il canale corretto in capacitor.config.ts
  2. Controlla l'upload del bundle: Verifica se il bundle è stato caricato sul canale inteso
  3. Esamina la versione minima dell'aggiornamento: Conferma --min-update-version (o --auto-min-update-version) è stato impostato e il canale utilizza --disable-auto-update metadata

Modifiche di sistema che interessano le versioni vecchie

Sezione intitolata “Modifiche di sistema che interessano le versioni vecchie”
  1. Soluzione immediata: Sovrascrivi i dispositivi interessati con il bundle sicuro
    • Dashborde → Dispositivi → Selezione di massa → Imposta Versione
  2. Soluzione a Lungo Termine: Crea canali versionati e mantiene rami separati
  3. Prevenzione: Testa sempre gli aggiornamenti su dispositivi rappresentativi prima del rilascio

Se stai migrando da Ionic AppFlow, il targeting di versione funziona in modo molto simile a Capgo, con maggiore flessibilità:

AppFlow ConceptCapgo EquivalentNote
Canale di distribuzioneCapgo CanaleLo stesso concetto, ma più potente
Versione nativa bloccata--min-update-version / --auto-min-update-versionPossibilità di controllo più granulare
Priorità del canalePrecedenza del canale (override → cloud → default)Precedenza più trasparente
Obiettivo di distribuzioneCanale + semver controlliDisponibili diverse strategie
Canale di produzioneproduction nome del canale (o qualsiasi altro nome)Nominativo flessibile
Deploy basato su GitCarica del bundle CLI da ramoLo stesso workflow
Corrispondenza automatica della versionedefaultChannel + vincoli di versioneRafforzato con diverse strategie

Differenze chiave per gli utenti di AppFlow

Differenze Chiave per gli Utenti di AppFlow
  1. Piu Controllo: Capgo offre strategie multiple (canali, semver, versione nativa) che possono essere combinate
  2. Piu Visibilita: La dashboard mostra la distribuzione delle versioni e gli eventuali problemi di compatibilita
  3. API Accesso: Controllo programmatico completo sulla versione di destinazione
  4. Auto-Hosting: Opzione per eseguire il proprio server di aggiornamento con la stessa logica di versione
  1. Mappa i tuoi canali di AppFlow a Capgo canale (di solito 1:1)
  2. Imposta defaultChannel in capacitor.config.ts per ogni versione maggiore
  3. Configura le regole semver se desideri il blocco automatico ai confini di versione
  4. Carica bundle specifiche per versione utilizzando --min-update-version (il canale deve utilizzare la strategia di metadata)
  5. Monitora la distribuzione delle versioni in Capgo dashboard
// 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 fornisce diverse strategie per la consegna di aggiornamenti specifici per versione:

  1. Routing basato sul canale: Separazione automatica delle versioni tramite defaultChannel
  2. Versionamento Semantico: Prevenire gli aggiornamenti tra confini di versione maggiore/minore/patch
  3. Restrizioni native di versione: Richiedere la versione minima nativa per i pacchetti
  4. Prevenzione del downgrade automatico: Mai distribuire bundle più vecchi a versioni native più nuove
  5. Device Overrides: Controllo manuale per test e targeting

Combinate queste strategie per ottenere la consegna automatica di aggiornamenti con AppFlow, con ancora più flessibilità e controllo. Scegli l'approccio che meglio si adatta al flusso di versioning e distribuzione del tuo app.

Per ulteriori informazioni sui dettagli specifici:

Continua con la configurazione di targeting delle versioni

Sezione intitolata “Continua con la versione di destinazione”

Se stai utilizzando Versione di destinazione per pianificare la routing dei canali e la distribuzione in fase di staging, connettilo con Canali per i dettagli di implementazione in Canali, Canali per i dettagli di implementazione in Canali, Canali Soluzione di testing beta per il flusso di lavoro del prodotto in Soluzione di testing beta, e Soluzione di testing beta Soluzione di Targeting di Versione per il flusso di lavoro del prodotto nella Soluzione di Targeting di Versione.