Version-Targeting
Kopiere einen Setup-Prompt mit den Installationsschritten und dem vollständigen Markdown-Guide für dieses Plugin.
Dieser Guide erklärt, wie du Nutzern basierend auf ihrer nativen App-Version automatisch das neueste kompatible Bundle auslieferst, ähnlich wie bei Ionic AppFlow. Das vereinfacht das Update-Management, beschleunigt Rollouts und verhindert Kompatibilitätsprobleme.
Übersicht
Abschnitt: „Übersicht“Das Version-Targeting von Capgo ermöglicht es dir:
- Kompatible Updates automatisch auszuliefern basierend auf der nativen App-Version der Nutzer
- Breaking Changes zu verhindern bei inkompatiblen App-Versionen
- Mehrere App-Versionen zu verwalten gleichzeitig ohne komplexe Logik
- Updates nahtlos ausrollen für spezifische Nutzersegmente
Warum Version Targeting wichtig ist (besonders für AppFlow-Nutzer)
Abschnitt mit dem Titel „Warum Version Targeting wichtig ist (besonders für AppFlow-Nutzer)“Wenn du bereits mit Ionic AppFlowvertraut bist, weißt du, wie wichtig es ist, dass Nutzer nur kompatible Updates erhalten. AppFlow hat live update Bundles automatisch mit den nativen App-Versionen abgeglichen, um zu verhindern, dass inkompatibles JavaScript an ältere native code ausgeliefert wird.
Capgo bietet dieselben Sicherheitsgarantien, mit zusätzlichen Features:
- Granularere Kontrolle beim Version-Matching
- Mehrere Strategien (Channels, SemVer, native Constraints)
- Bessere Übersicht über die Versionsverteilung
- API und CLI steuern zusammen mit dem Dashboard-Management
Dieser Ansatz ist besonders nützlich, wenn:
- Deine Nutzer verwenden unterschiedliche Hauptversionen deiner App (z. B. v1.x, v2.x, v3.x)
- Du Abwärtskompatibilität wahren musst, während du Breaking Changes ausrollst
- Du verhindern willst, dass neuere Bundles ältere native code zerschießen
- Du Nutzer schrittweise von einer Version auf eine andere migrierst
- Du von AppFlow migrierst und die gleiche Update-Sicherheit beibehalten willst
So funktioniert es
Abschnitt „So funktioniert es“Capgo nutzt einen mehrschichtigen Ansatz, um Nutzer mit kompatiblen Updates zu matchen:
- Native Versions-Constraints: Verhindert, dass Bundles an inkompatible Native Builds ausgeliefert werden
- Channel-basiertes Routing: Verschiedene App-Versionen auf unterschiedliche Update-Channels routen
- Semantic Versioning Steuerung: Updates über Major/Minor/Patch-Grenzen hinweg automatisch blockieren
- Geräteübergreifende Overrides: Spezifische Geräte oder Nutzergruppen anvisieren
Ablauf der Versionszuordnung
Abschnitt mit dem Titel „Version Matching Flow“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]Strategie 1: Channel-basiertes Version-Routing
Abschnitt mit dem Titel „Strategie 1: Channel-basiertes Version-Routing“Dies ist der empfohlene Ansatz für das Management von Breaking Changes und Major-Version-Updates. Er ähnelt dem Delivery-Modell von AppFlow.
Beispielszenario
Abschnitt mit dem Titel „Beispiel-Szenario“- App v1.x (100.000 Nutzer) →
productionChannel - App v2.x (50.000 Nutzer mit Breaking Changes) →
v2Channel - App v3.x (10.000 Beta-Nutzer) →
v3Channel
Implementierung
Abschnitt „Implementierung“Schritt 1: Channels für jede Major-Version konfigurieren
Abschnitt mit dem Titel „Schritt 1: Channels für jede Major-Version konfigurieren“// 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 } }};Schritt 2: Channels erstellen
Abschnitt mit dem Titel „Schritt 2: Channels erstellen“# 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-assignSchritt 3: Versionsspezifische Bundles hochladen
Abschnitt mit dem Titel „Schritt 3: Versionsspezifische Bundles hochladen“# 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 v3- Keine code-Änderungen - Channel-Routing erfolgt automatisch
- Klare Trennung - Jede Version hat eine eigene Update-Pipeline
- Flexibles Targeting - Updates gezielt an Version-Gruppen pushen
- Sichere Rollouts - Breaking Changes erreichen keine inkompatiblen Versionen
Strategie 2: Semantic Versioning Controls
Abschnitt mit dem Titel „Strategie 2: Semantic Versioning Controls“Nutze die integrierten Capgo Semantic Versioning Controls um Updates über Versionsgrenzen hinweg zu verhindern.
Auto-Updates über Major-Versionen hinweg deaktivieren
Abschnitt mit dem Titel „Auto-Updates über Major-Versionen hinweg deaktivieren“# Create a channel that blocks major version updatesnpx @capgo/cli channel add stablenpx @capgo/cli channel set stable --disable-auto-update majorDiese Konfiguration bedeutet:
- Nutzer der App-Version 1.2.3 erhalten Updates bis zu 1.9.9
- Nutzer werden NICHT die Version 2.0.0 automatisch
- Verhindert, dass Breaking Changes ältere native code erreichen
- Der Vergleich nutzt die als Baseline gesendete
version_build
Granulare Steuerungsoptionen
Abschnitt mit dem Titel „Granulare Steuerungsoptionen“# 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 noneStrategie 3: Native-Versionsbeschränkungen
Abschnitt: „Strategie 3: Native Versionsbeschränkungen“Geben Sie eine minimale native App-Version (min_update_version) pro Bundle an, damit Capgo es nur an Geräte ausliefert, deren native Binary aktuell genug ist.
Dies nutzt die Channel- Metadaten- Strategie (--disable-auto-update metadata) sowie --min-update-version oder --auto-min-update-version beim Upload. Es gibt kein --native-version CLI Flag.
Metadata-Targeting im Channel aktivieren
Abschnitt: „Metadata-Targeting für den Channel aktivieren“# one-time: require min_update_version metadata on uploads to this channelnpx @capgo/cli@latest channel set production --disable-auto-update metadataMinimale native Version beim Upload festlegen
Abschnitt: „Mindestversion der Native Build beim Upload festlegen“Geben Sie beim Hochladen eines Bundles die niedrigste native Version an, die dieses erhalten darf:
# This bundle requires native version 2.0.0 or highernpx @capgo/cli@latest bundle upload \ --channel production \ --min-update-version "2.0.0"Oder lassen Sie Capgo die Untergrenze für die Native Build-Kompatibilität festlegen:
npx @capgo/cli@latest bundle upload \ --channel production \ --auto-min-update-versionAnwendungsfälle
Abschnitt „Use Cases“-
Neues natives Plugin erforderlich
Terminalfenster # Bundle needs Camera plugin added in v2.0.0npx @capgo/cli@latest bundle upload \--channel production \--min-update-version "2.0.0" -
Breaking Changes bei nativen API
Terminalfenster # Bundle uses new Capacitor 6 APIsnpx @capgo/cli@latest bundle upload \--channel production \--min-update-version "3.0.0" -
Schrittweise Migration
Terminalfenster # 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"
Strategie 4: Auto-Downgrade-Prävention
Abschnitt mit dem Titel „Strategie 4: Auto-Downgrade-Prävention“Verhindert, dass Nutzer Bundles erhalten, die älter als ihre aktuelle Native Build-Version sind.
In den Channel-Einstellungen aktivieren
Abschnitt mit dem Titel „In Channel-Einstellungen aktivieren“Im Capgo Dashboard:
- Gehe zu Kanäle → Channel auswählen
- Aktivieren „Disable auto downgrade under native“
- Änderungen speichern
Oder über CLI:
npx @capgo/cli@latest channel set production --no-downgradeBeispiel
Abschnitt „Example“- Gerät des Nutzers: Native Version 1.2.5
- Channel-Bundle: Version 1.2.3
- Ergebnis: Update wird blockiert (wäre ein Downgrade)
Das ist nützlich, wenn:
- Nutzer haben manuell eine neuere Version aus dem App Store installiert
- Du musst sicherstellen, dass Nutzer immer die neuesten Security-Patches erhalten
- Du möchtest Regression-Bugs verhindern
Strategie 5: Targeting auf Geräteebene
Abschnitt: „Strategie 5: Device-Level Targeting“Channel-Zuweisung für bestimmte Geräte oder Nutzergruppen überschreiben.
Spezifische Version für Tests erzwingen
Abschnitt: „Spezifische Version für Tests erzwingen“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' }) }}Device-Override im Dashboard
Abschnitt „Dashboard Device Override“Im Capgo Dashboard:
- Gehe zu Geräte → Gerät suchen
- Klicken Channel festlegen oder Version festlegen
- Mit spezifischem Channel oder Bundle-Version überschreiben
- Das Gerät erhält Updates von der überschriebenen Quelle
Vollständiger AppFlow-ähnlicher Workflow
Abschnitt mit dem Titel „Vollständiger AppFlow-Style Workflow“Hier ist ein vollständiges Beispiel, das alle Strategien kombiniert:
1. Initiales Setup (App v1.0.0)
Abschnitt mit dem Titel „1. Initial Setup (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. Breaking Change veröffentlichen (App v2.0.0)
Abschnitt mit dem Titel „2. Breaking Change veröffentlichen (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. Updates für beide Versionen pushen
Abschnitt mit dem Titel „3. Updates für beide Versionen pushen“# 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. Versionsverteilung überwachen
Abschnitt mit dem Titel „4. Versionsverteilung überwachen“Use the Capgo dashboard to track:
- Anzahl der Nutzer auf v1 vs. v2
- Bundle-Adoptionsrate pro Version
- Fehler oder Crashes pro Version
5. Alte Version deprecate
Abschnitt mit dem Titel „5. Alte Version deprecate“Sobald die v1-Nutzung unter den Schwellenwert fällt:
# 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)Channel-Priorität
Abschnitt mit dem Titel „Channel-Priorität“Wenn mehrere Channel-Konfigurationen existieren, nutzt Capgo diese Priorisierung:
- Geräte-Override (Dashboard oder API) – Höchste Priorität, sichtbar im Device Override UI
- Lokaler Plugin-Channel über
setChannel()- Nur auf dem Gerät gespeichert, nicht im Device Override UI sichtbar - defaultChannel in capacitor.config.ts
- Standard-Channel (Cloud-Einstellung) – Niedrigste Priorität
Best Practices
Abschnitt mit dem Titel „Best Practices“1. Setze defaultChannel immer für Major Versions
Abschnitt mit dem Titel „1. Setze defaultChannel immer für Major Versions“// ✅ 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. Nutze Semantic Versioning
Abschnitt mit dem Titel „2. Nutze Semantic Versioning“# ✅ Good1.0.0 → 1.0.1 → 1.1.0 → 2.0.0
# ❌ Bad1.0 → 1.1 → 2 → 2.53. Separate Branches pflegen
Abschnitt mit dem Titel „3. Separate Branches pflegen“# ✅ Good: Separate branches per major versionmain (v3.x)v2-maintenance (v2.x)v1-maintenance (v1.x)
# ❌ Bad: Single branch for all versions4. Vor dem Rollout testen
Abschnitt mit dem Titel „4. Vor dem Rollout testen“# 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. Versionsverteilung überwachen
Abschnitt mit dem Titel „5. Versionsverteilung überwachen“Prüfe regelmäßig dein Dashboard:
- Upgraden Nutzer auf neuere Native Builds?
- Haben alte Versionen noch hohen Traffic?
- Should you deprecate old channels?
Vergleich mit Ionic AppFlow
Abschnitt mit dem Titel „Vergleich mit Ionic AppFlow“Für Teams, die von Ionic AppFlowmigrieren, zeigt dieser Vergleich das Version Targeting von Capgo:
| Funktion | Ionic AppFlow | Capgo |
|---|---|---|
| Versionsbasiertes Routing | Automatisch basierend auf der Native Version | Automatisch über defaultChannel + mehrere Strategien |
| Semantic Versioning | Basis-Support | Erweitert mit --disable-auto-update (major/minor/patch) |
| Native Version-Constraints | Manuelle Konfiguration im AppFlow Dashboard | Integriert --min-update-version / --auto-min-update-version mit Metadata-Channels |
| Channel-Management | Web-UI + CLI | Web-UI + CLI + API |
| Device-Overrides | Begrenzte Kontrolle auf Geräteebene | Volle Kontrolle via Dashboard/API |
| Schutz vor Auto-Downgrades | Ja | Ja, via --no-downgrade |
| Wartung mehrerer Versionen | Manuelles Branch-/Channel-Management | Automatisch mit Channel-Priorisierung |
| Self-Hosting | Nein | Ja (volle Kontrolle) |
| Versions-Analytics | Basis | Detaillierte Metriken pro Version |
Fehlerbehebung
Abschnitt mit dem Titel „Troubleshooting“Nutzer erhalten keine Updates
Abschnitt mit dem Titel „Nutzer erhalten keine Updates“Prüfe Folgendes:
-
Channel-Zuweisung: Überprüfen, ob das Gerät im richtigen Channel ist
const channel = await CapacitorUpdater.getChannel()console.log('Current channel:', channel) -
Versionsbeschränkungen: Prüfe, ob das Bundle native Versionsanforderungen hat
- Dashboard → Bundles → Spalte „Native Version“ prüfen
-
Semver-Einstellungen: Überprüfe die Channel-
disable-auto-updateEinstellungenTerminalfenster npx @capgo/cli channel list -
Geräte-Override: Prüfen, ob ein manueller Override am Gerät vorliegt
- Dashboard → Devices → Gerät suchen → Channel/Version prüfen
Bundle an falsche Version geliefert
Abschnitt mit dem Titel „Bundle an falsche Version geliefert“- defaultChannel prüfen: Sicherstellen, dass der richtige Channel eingestellt ist
capacitor.config.ts - Bundle Upload prüfen: Verifizieren, dass das Bundle im richtigen Channel hochgeladen wurde
- Min. Update-Version prüfen: Bestätigen
--min-update-version(oder--auto-min-update-version) wurde gesetzt und der Channel nutzt--disable-auto-update metadata
Breaking Changes, die alte Versionen betreffen
Abschnitt mit dem Titel „Breaking Changes, die alte Versionen betreffen“- Sofortige Lösung: Betroffene Geräte auf ein sicheres Bundle umstellen
- Dashboard → Devices → Mehrere auswählen → Version festlegen
- Langfristige Lösung: Versionsspezifische Channels erstellen und separate Branches pflegen
- Prävention: Updates vor dem Rollout immer auf repräsentativen Geräten testen
Migration von Ionic AppFlow
Abschnitt mit dem Titel „Migration von Ionic AppFlow“Wenn Sie migrieren von Ionic AppFlowmigrierst, funktioniert das Version Targeting in Capgo sehr ähnlich, aber mit mehr Flexibilität:
Konzept-Mapping
Abschnitt mit dem Titel „Konzept-Mapping“| AppFlow-Konzept | Capgo Äquivalent | Notizen |
|---|---|---|
| Deploy-Channel | Capgo Channel | Gleiches Konzept, mehr Power |
| Native Version-Sperre | --min-update-version / --auto-min-update-version | Granularere Kontrolle |
| Channel-Priorität | Channel-Reihenfolge (override → cloud → default) | Transparentere Priorisierung |
| Deployment-Ziel | Channel + SemVer-Steuerung | Mehrere Strategien verfügbar |
| Production-Channel | production channel (oder ein beliebiger Name) | Flexible Benennung |
| Git-basiertes Deployment | CLI Bundle-Upload via Branch | Gleicher Workflow |
| Automatisches Version-Matching | defaultChannel + Versionsbeschränkungen | Erweitert durch mehrere Strategien |
Wichtige Unterschiede für AppFlow-Nutzer
Abschnitt mit dem Titel „Wichtige Unterschiede für AppFlow-Nutzer“- Mehr KontrolleMit Capgo stehen dir verschiedene Strategien (Channels, SemVer, Native Version) zur Verfügung, die kombiniert werden können
- Bessere Übersicht: Das Dashboard zeigt die Versionsverteilung und Kompatibilitätsprobleme
- API Zugriff: Volle programmatische Kontrolle über das Version-Targeting
- Self-Hosting: Option, einen eigenen Update-Server mit derselben Version-Logik zu betreiben
Migrationsschritte
Abschnitt mit dem Titel „Migrationsschritte“- Mappe deine AppFlow-Channels auf Capgo Channels (meist 1:1)
- Setzen Sie
defaultChannelincapacitor.config.tsfür jede Major-Version - Semver-Regeln konfigurieren wenn Sie automatisches Blockieren an Versionsgrenzen wünschen
- Versionsspezifische Bundles hochladen mit
--min-update-version(Channel muss Metadata-Strategie nutzen) - Versionsverteilung überwachen im Capgo Dashboard
Erweiterte Patterns
Abschnitt mit dem Titel „Advanced Patterns“Schrittweiser Rollout nach Version
Abschnitt mit dem Titel „Schrittweiser Rollout nach Version“// 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 Flags nach Version
Abschnitt mit dem Titel „Feature Flags nach Version“// 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 über Versionen hinweg
Abschnitt mit dem Titel „A/B-Testing über Versionen hinweg“// 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 }) }}Zusammenfassung
Abschnitt „Zusammenfassung“Capgo bietet verschiedene Strategien für die versionsspezifische Auslieferung von Updates:
- Channel-basiertes Routing: Automatische Versionstrennung via
defaultChannel - Semantische Versionierung: Updates über Major/Minor/Patch-Grenzen verhindern
- Native Versionsbeschränkungen: Mindestversion der Native Build für Bundles erzwingen
- Auto-Downgrade-Prävention: Keine älteren Bundles an neuere Native Builds liefern
- Geräte-Overrides: Manuelle Steuerung für Tests und Targeting
Durch die Kombination dieser Strategien erreichen Sie eine automatische Update-Auslieferung wie bei AppFlow – mit noch mehr Flexibilität und Kontrolle. Wählen Sie den Ansatz, der am besten zu Ihrem Versionierungs- und Deployment-Workflow passt.
Weitere Details zu den einzelnen Features:
- Guide zu Breaking Changes - Detaillierte Strategie zur Channel-Versionierung
- Channel-Management - Vollständige Channel-Konfigurationsreferenz
- Update-Verhalten - Native Version-Verzögerungen und Bedingungen
Weiterlesen zu Version Targeting
Abschnitt mit dem Titel „Weiterlesen zu Version Targeting“Wenn du es nutzt Version-Targeting um Channel-Routing und Staged Rollout zu planen, verbinde es mit Kanäle für die Implementierungsdetails in Channels, Kanäle für die Implementierungsdetails in Channels, Kanäle für die Implementierungsdetails in Channels, Beta-Testing-Lösung für den Produkt-Workflow in der Beta-Testing-Lösung, und Version-Targeting-Lösung für den Produkt-Workflow in der Version-Targeting-Lösung.