Targeting delle versioni
Copia un prompt di configurazione con i passaggi di installazione e la guida markdown completa per questo plugin.
Questa guida spiega come distribuire automaticamente l'ultimo bundle compatibile agli utenti in base alla versione della loro app nativa, simile all'approccio di Ionic AppFlow. Ciò semplifica la gestione degli aggiornamenti e accelera i rollout, evitando problemi di compatibilità.
Panoramica
Sezione intitolata “Panoramica”Il sistema di version targeting di Capgo ti permette di:
- Distribuire automaticamente update compatibili agli utenti in base alla versione nativa dell'app
- Evitare che le breaking changes raggiungano versioni dell'app incompatibili
- Gestire più versioni dell'app contemporaneamente senza logiche complesse
- Distribuisci gli update senza attriti a segmenti specifici di utenti
Perché il Version Targeting è fondamentale (specialmente per gli utenti AppFlow)
Sezione intitolata “Perché il Version Targeting è fondamentale (specialmente per gli utenti AppFlow)”Se hai familiarità con Ionic AppFlow, sai quanto sia critico garantire che gli utenti ricevano solo update compatibili. AppFlow associava automaticamente i bundle live update alle versioni native dell'app, evitando che JavaScript incompatibili venissero inviati a vecchi code nativi.
Capgo offre le stesse garanzie di sicurezza, con funzionalità aggiuntive:
- Controllo più granulare sul version matching
- Strategie multiple (canali, semver, vincoli nativi)
- Maggiore visibilità sulla distribuzione delle versioni
- API e CLI si gestiscono insieme alla dashboard
Questo approccio è particolarmente utile quando:
- Hai utenti su diverse versioni principali della tua app (es. v1.x, v2.x, v3.x)
- Devi mantenere la backward compatibility durante il rilascio di breaking changes
- Vuoi evitare che bundle più recenti rompano vecchi code nativi
- Stai migrando gli utenti gradualmente da una versione all'altra
- Stai migrando da AppFlow e vuoi mantenere lo stesso livello di sicurezza degli update
Come funziona
Sezione intitolata “Come funziona”Capgo usa un approccio multi-livello per abbinare gli utenti agli update compatibili:
- Vincoli di versione native: Impedisce la consegna dei bundle a versioni native incompatibili
- Routing basato sui Channel: Instrada versioni diverse dell'app verso canali di update diversi
- Controlli del Semantic Versioning: Blocca automaticamente gli update tra versioni major, minor o patch
- Override a livello di dispositivo: Indirizza dispositivi specifici o gruppi di utenti
Flusso di matching delle versioni
Sezione intitolata “Flusso di Version Matching”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]Strategia 1: Routing delle versioni basato sui channel
Sezione intitolata “Strategia 1: Routing delle versioni basato sui canali”Questo è l' approccio consigliato per gestire breaking changes e aggiornamenti di versione major. È simile al modello di distribuzione di AppFlow.
Scenario di esempio
Sezione intitolata “Scenario di esempio”- App v1.x (100.000 utenti) →
productioncanale - App v2.x (50.000 utenti con breaking changes) →
v2canale - App v3.x (10.000 utenti beta) →
v3canale
Implementazione
Sezione intitolata “Implementazione”Passaggio 1: Configura i canali per ogni versione major
Sezione intitolata “Passaggio 1: Configura i canali per ogni versione major”// capacitor.config.ts for version 1.x buildsimport { 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 buildsconst 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 buildsconst config: CapacitorConfig = { appId: 'com.example.app', appName: 'Example App', plugins: { CapacitorUpdater: { autoUpdate: 'atBackground', defaultChannel: 'v3', // Routes v3 users automatically } }};Passaggio 2: Crea i canali
Sezione intitolata “Passaggio 2: Crea i canali”# Create channels for each major versionnpx @capgo/cli channel add productionnpx @capgo/cli channel add v2npx @capgo/cli channel add v3
# Enable self-assignment so apps can switch channelsnpx @capgo/cli channel set production --self-assignnpx @capgo/cli channel set v2 --self-assignnpx @capgo/cli channel set v3 --self-assignPassaggio 3: Carica i bundle per versione
Passaggio 3: Carica i bundle per versione# For v1.x users (from v1-maintenance branch)git checkout v1-maintenancenpm run buildnpx @capgo/cli bundle upload --channel production
# For v2.x users (from v2-maintenance or main branch)git checkout mainnpm run buildnpx @capgo/cli bundle upload --channel v2
# For v3.x users (from beta/v3 branch)git checkout betanpm run buildnpx @capgo/cli bundle upload --channel v3Vantaggi
Sezione intitolata “Vantaggi”- Zero modifiche al code - Il routing dei channel è automatico
- Separazione netta - Ogni versione ha la sua pipeline di update
- Targeting flessibile - Spingi update a gruppi di versioni specifici
- Rollout sicuri - I breaking change non raggiungono versioni incompatibili
Strategia 2: Controlli sul Semantic Versioning
Sezione intitolata “Strategia 2: Semantic Versioning Controls”Usa i controlli integrati di Capgo per il semantic versioning per evitare update tra versioni diverse.
Disabilita l'auto-update tra le major version
Sezione: “Disabilita l'auto-update tra versioni major”# Create a channel that blocks major version updatesnpx @capgo/cli channel add stablenpx @capgo/cli channel set stable --disable-auto-update majorQuesta configurazione significa:
- Gli utenti con versione app 1.2.3 riceveranno aggiornamenti fino a 1.9.9
- Gli utenti NON riceveranno la versione 2.0.0 automaticamente
- Evita che breaking changes raggiungano vecchi code nativi
- Il confronto utilizza il baseline nativo inviato come
version_build
Opzioni di controllo granulare
Sezione intitolata “Granular Control Options”# 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 updatesnpx @capgo/cli channel set stable --disable-auto-update noneStrategia 3: Vincoli sulla native version
Sezione: “Strategia 3: Vincoli della versione Native”Specifica una versione minima dell'app native (min_update_version) su ogni bundle, così Capgo lo invierà solo ai dispositivi con un binario native sufficientemente aggiornato.
Questo utilizza la strategia metadati del canale (--disable-auto-update metadata) unita a --min-update-version o --auto-min-update-version al momento dell'upload. Non esiste un --native-version flag CLI.
Abilita il targeting dei metadati sul channel
Sezione: “Abilita il targeting dei metadati sul canale”# one-time: require min_update_version metadata on uploads to this channelnpx @capgo/cli@latest channel set production --disable-auto-update metadataImposta una native version minima all'upload
Sezione intitolata “Imposta una versione nativa minima all’upload”Quando carichi un bundle, specifica la versione nativa più bassa che può riceverlo:
# This bundle requires native version 2.0.0 or highernpx @capgo/cli@latest bundle upload \ --channel production \ --min-update-version "2.0.0"Oppure lascia che Capgo fissi il minimo dalla compatibilità del pacchetto nativo:
npx @capgo/cli@latest bundle upload \ --channel production \ --auto-min-update-versionCasi d'uso
Sezione "Use Cases"-
Nuovo plugin nativo richiesto
Finestra del terminale # Bundle needs Camera plugin added in v2.0.0npx @capgo/cli@latest bundle upload \--channel production \--min-update-version "2.0.0" -
Modifiche breaking al API nativo
Finestra del terminale # Bundle uses new Capacitor 6 APIsnpx @capgo/cli@latest bundle upload \--channel production \--min-update-version "3.0.0" -
Migrazione Graduale
Finestra del terminale # one-time: enable metadata gating on betanpx @capgo/cli@latest channel set beta --disable-auto-update metadata# Test bundle only on latest native versionnpx @capgo/cli@latest bundle upload \--channel beta \--min-update-version "2.5.0"
Strategia 4: Prevenzione Auto-Downgrade
Sezione intitolata “Strategia 4: Prevenzione Auto-Downgrade”Impedisci agli utenti di ricevere bundle più vecchi della loro versione native attuale.
Abilita nelle Channel Settings
Sezione intitolata “Abilita nelle Channel Settings”Nel dashboard di Capgo:
- Vai su Canali → Seleziona il tuo canale
- Abilita “Disabilita il downgrade automatico in modalità native”
- Salva modifiche
O tramite CLI:
npx @capgo/cli@latest channel set production --no-downgradeEsempio
Sezione intitolata “Esempio”- Dispositivo dell’utente: versione native 1.2.5
- Bundle del canale: versione 1.2.3
- Risultato: L'aggiornamento è bloccato (sarebbe un downgrade)
È utile quando:
- Gli utenti hanno installato manualmente una versione più recente dall'app store
- Devi garantire che gli utenti abbiano sempre le ultime patch di sicurezza
- Vuoi prevenire bug di regressione
Strategia 5: Targeting a livello di dispositivo
Sezione intitolata “Strategia 5: Targeting a livello di dispositivo”Sovrascrivi l'assegnazione del canale per dispositivi specifici o gruppi di utenti.
Forza una versione specifica per i test
Sezione intitolata “Forza una versione specifica per i test”import { CapacitorUpdater } from '@capgo/capacitor-updater'
// Force beta testers to use v3 channelasync function assignBetaTesters() { const deviceId = await CapacitorUpdater.getDeviceId()
// Check if user is beta tester if (isBetaTester(userId)) { await CapacitorUpdater.setChannel({ channel: 'v3' }) }}Override dei dispositivi nella Dashboard
Sezione intitolata “Dashboard Device Override”Nella dashboard di Capgo:
- Vai su Dispositivi → Trova il dispositivo
- Clicca su Imposta Channel o Imposta Version
- Override con channel o versione bundle specifica
- Il dispositivo riceverà gli update dalla sorgente indicata
Workflow completo in stile AppFlow
Sezione intitolata “Workflow completo in stile AppFlow”Ecco un esempio completo che combina tutte le strategie:
1. Setup iniziale (App v1.0.0)
Sezione intitolata “1. Setup iniziale (App v1.0.0)”# Create production channel, then enable metadata min-version gatingnpx @capgo/cli@latest channel add productionnpx @capgo/cli@latest channel set production \ --disable-auto-update metadata \ --no-downgradeconst config: CapacitorConfig = { plugins: { CapacitorUpdater: { autoUpdate: 'atBackground', defaultChannel: 'production', } }};2. Rilascio Breaking Change (App v2.0.0)
Sezione intitolata “2. Rilascio Breaking Change (App v2.0.0)”# Create v2 channel for new versionnpx @capgo/cli@latest channel add v2npx @capgo/cli@latest channel set v2 \ --disable-auto-update metadata \ --no-downgrade \ --self-assign
# Create git branch for v1 maintenancegit checkout -b v1-maintenancegit push origin v1-maintenance// capacitor.config.ts for v2.0.0const config: CapacitorConfig = { plugins: { CapacitorUpdater: { autoUpdate: 'atBackground', defaultChannel: 'v2', // New users get v2 channel } }};3. Push degli Update su entrambe le versioni
Sezione intitolata “3. Push degli Update su entrambe le versioni”# Update v1.x users (bug fix)git checkout v1-maintenance# Make changesnpx @capgo/cli@latest bundle upload \ --channel production \ --min-update-version "1.0.0"
# Update v2.x users (new feature)git checkout main# Make changesnpx @capgo/cli@latest bundle upload \ --channel v2 \ --min-update-version "2.0.0"4. Monitoraggio della distribuzione delle versioni
Sezione intitolata “4. Monitoraggio della distribuzione delle versioni”Usa la dashboard di Capgo per monitorare:
- Numero di utenti su v1 rispetto a v2
- Tasso di adozione dei bundle per versione
- Errori o crash per versione
5. Deprecare la vecchia versione
Sezione intitolata “5. Deprecare la vecchia versione”Quando l'utilizzo di v1 scende sotto la soglia:
# Stop uploading to production channel# Optional: Delete v1 maintenance branchgit branch -d v1-maintenance
# Move all remaining users to default# (They'll need to update via app store)Precedenza dei canali
Sezione intitolata “Precedenza dei canali”In presenza di più configurazioni di canale, Capgo segue questo ordine di precedenza:
- Override del dispositivo (Dashboard o API) - Priorità massima, visibile nella UI Device Override
- Canale plugin locale tramite
setChannel()- Salvato solo sul dispositivo e non visibile nella UI Device Override - defaultChannel in capacitor.config.ts
- Canale predefinito (Impostazione Cloud) - Priorità minima
Best practice
Sezione “Best practice”1. Imposta sempre defaultChannel per le Major Version
Sezione: “1. Imposta sempre defaultChannel per le Major Version”// ✅ 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 manually2. Usa il Semantic Versioning
Sezione: “2. Usa il Semantic Versioning”# ✅ Good1.0.0 → 1.0.1 → 1.1.0 → 2.0.0
# ❌ Bad1.0 → 1.1 → 2 → 2.53. Mantieni branch separati
Sezione intitolata “3. Mantieni branch separati”# ✅ Good: Separate branches per major versionmain (v3.x)v2-maintenance (v2.x)v1-maintenance (v1.x)
# ❌ Bad: Single branch for all versions4. Testa prima del rollout
Sezione intitolata “4. Testa prima del rollout”# one-time: create beta and enable metadata gating# (production is set up in the complete workflow above)npx @capgo/cli@latest channel add betanpx @capgo/cli@latest channel set beta --disable-auto-update metadata
# Test on beta channel firstnpx @capgo/cli@latest bundle upload \ --channel beta \ --auto-min-update-version
# Monitor for issues, then promote to productionnpx @capgo/cli@latest bundle upload \ --channel production \ --auto-min-update-version5. Monitora la distribuzione delle versioni
Sezione intitolata “5. Monitora la distribuzione delle versioni”Controlla regolarmente la tua dashboard:
- Gli utenti stanno passando a nuove versioni native?
- Le vecchie versioni ricevono ancora molto traffico?
- Dovresti deprecare i vecchi canali?
Confronto con Ionic AppFlow
Sezione: “Confronto con Ionic AppFlow”Per i team che migrano da Ionic AppFlow, ecco come si confronta il version targeting di Capgo:
| Funzionalità | Ionic AppFlow | Capgo |
|---|---|---|
| Routing basato sulla versione | Automatico in base alla versione nativa | Automatico tramite defaultChannel + strategie multiple |
| Versionamento semantico | Supporto base | Avanzato con --disable-auto-update (major/minor/patch) |
| Vincoli della versione nativa | Configurazione manuale in AppFlow dashboard | Integrato --min-update-version / --auto-min-update-version con canali metadata |
| Gestione canali | Web UI + CLI | Web UI + CLI + API |
| Override dei dispositivi | Controllo limitato a livello device | Controllo totale via Dashboard/API |
| Prevenzione auto-downgrade | Sì | Sì, tramite --no-downgrade |
| Manutenzione multi-versione | Gestione manuale branch/channel | Automatizzata con precedenza channel |
| Self-hosting | No | Sì (controllo totale) |
| Analytics delle versioni | Base | Metriche dettagliate per versione |
Risoluzione problemi
Sezione intitolata “Troubleshooting”Gli utenti non ricevono gli aggiornamenti
Sezione: “Gli utenti non ricevono gli aggiornamenti”Controlla quanto segue:
-
Assegnazione del Channel: Verifica che il dispositivo sia sul channel corretto
const channel = await CapacitorUpdater.getChannel()console.log('Current channel:', channel) -
Vincoli di Versione: Controlla se il bundle ha requisiti di versione nativa
- Dashboard → Bundles → Controlla la colonna “Native Version”
-
Impostazioni Semver: Verifica l'impostazione del
disable-auto-updatechannelFinestra del terminale npx @capgo/cli channel list -
Override del dispositivo: Verifica se il dispositivo ha un override manuale
- Dashboard → Devices → Cerca dispositivo → Controlla channel/versione
Bundle inviato alla versione errata
Sezione: “Bundle consegnato alla versione errata”- Controlla il defaultChannel: Assicurati che il channel sia corretto
capacitor.config.ts - Controlla l'upload del Bundle: Verifica che il bundle sia stato caricato sul channel previsto
- Ispeziona la min update version: Conferma
--min-update-version(o--auto-min-update-version) è stata impostata e il canale utilizza--disable-auto-update metadata
Breaking Changes sulle versioni precedenti
Sezione: “Breaking Changes che influenzano le vecchie versioni”- Soluzione Immediata: Forza i dispositivi interessati su un bundle sicuro
- Dashboard → Dispositivi → Selezione multipla → Imposta versione
- Soluzione a Lungo Termine: Crea canali versionati e mantieni branch separati
- Prevenzione: Testa sempre gli update su dispositivi rappresentativi prima del rollout
Migrazione da Ionic AppFlow
Sezione: “Migrazione da Ionic AppFlow”Se stai migrando da Ionic AppFlow, il version targeting in Capgo funziona in modo molto simile, ma con maggiore flessibilità:
Mappatura dei concetti
Sezione: “Mappatura dei concetti”| Concetto AppFlow | Equivalente Capgo | Note |
|---|---|---|
| Canale di Deploy | Canale Capgo | Stesso concetto, più potente |
| Lock della versione Native | --min-update-version / --auto-min-update-version | Controllo più granulare |
| Priorità del canale | Precedenza canali (override → cloud → default) | Precedenza più trasparente |
| Target di deployment | Controllo tramite canale + semver | Strategie multiple disponibili |
| Canale di produzione | production channel (o qualsiasi nome) | Naming flessibile |
| Deployment basato su Git | Upload del bundle CLI da branch | Stesso workflow |
| Matching automatico della versione | defaultChannel + vincoli di versione | Potenziato con strategie multiple |
Differenze chiave per utenti AppFlow
Sezione intitolata “Differenze chiave per utenti AppFlow”- Maggiore controlloCon Capgo hai a disposizione diverse strategie (canali, semver, versione nativa) combinabili tra loro
- Maggiore visibilitàLa dashboard mostra la distribuzione delle versioni e i problemi di compatibilità
- Accesso API: Controllo programmatico completo sul version targeting
- Self-hosting: Opzione per gestire il proprio server di update con la stessa logica di versione
Step di migrazione
Sezione intitolata “Passaggi per la migrazione”- Mappa i tuoi canali AppFlow sui canali Capgo (solitamente 1:1)
- Imposta
defaultChannelnellacapacitor.config.tsper ogni versione major - Configura le regole semver se desideri il blocco automatico ai limiti di versione
- Carica bundle specifici per versione usando
--min-update-version(il canale deve usare la strategia metadata) - Monitora la distribuzione delle versioni nella dashboard di Capgo
Pattern avanzati
Sezione intitolata “Advanced Patterns”Rollout graduale per versione
Sezione: “Rollout graduale per versione”// Gradually migrate v1 users to v2async 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' }) }}Feature flag per versione
Sezione: “Feature Flag per versione”// Enable features based on native versionasync 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() }}A/B testing tra versioni
Sezione: “A/B Testing tra versioni”// Run A/B tests within same native versionasync 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 }) }}Riassunto
Sezione: “Riassunto”Capgo offre diverse strategie per distribuire gli aggiornamenti a versioni specifiche:
- Routing basato sui Channel: Separazione automatica delle versioni tramite
defaultChannel - Versionamento Semantico: Impedisce aggiornamenti oltre i confini major/minor/patch
- Vincoli di versione native: Richiede una versione native minima per i bundle
- Prevenzione dell'auto-downgrade: Non distribuisce mai bundle più vecchi a versioni native più recenti
- Override per dispositivo: Controllo manuale per test e targeting
Combinando queste strategie, puoi ottenere una distribuzione automatica degli aggiornamenti in stile AppFlow, con ancora più flessibilità e controllo. Scegli l'approccio che meglio si adatta al versioning e al workflow di deployment della tua app.
Per maggiori dettagli sulle singole funzionalità:
- Guida alle Breaking Changes - Strategia dettagliata per il versioning dei canali
- Gestione dei canali - Riferimento completo alla configurazione dei canali
- Comportamento degli aggiornamenti - Ritardi e condizioni delle versioni native
Continua da Version Targeting
Sezione intitolata “Continua da Version Targeting”Se stai usando Targeting delle versioni per pianificare il routing dei canali e il rollout graduale, connettilo a Canali per i dettagli di implementazione nei Channels, Canali per i dettagli di implementazione nei Channels, Canali per i dettagli di implementazione nei Channels, Soluzione Beta Testing per il workflow di prodotto nella Soluzione Beta Testing, e Soluzione Version Targeting per il workflow di prodotto nella Soluzione Version Targeting.