Targeting Versi
Salin prompt setup yang berisi langkah install dan panduan markdown lengkap untuk plugin ini.
Panduan ini menjelaskan cara mengirimkan bundle terbaru yang kompatibel secara otomatis ke pengguna berdasarkan versi native app mereka, mirip dengan pendekatan Ionic AppFlow. Ini memastikan manajemen update yang lebih simpel dan rollout yang lebih cepat sekaligus mencegah masalah kompatibilitas.
Ikhtisar
Bagian berjudul “Ringkasan”Dengan sistem version targeting Capgo, Anda dapat:
- Mengirimkan update yang kompatibel secara otomatis ke pengguna berdasarkan versi native app mereka
- Mencegah breaking changes sampai ke versi app yang tidak kompatibel
- Mengelola banyak versi app secara bersamaan tanpa logika yang rumit
- Rilis update dengan mulus ke segmen pengguna tertentu
Mengapa Version Targeting Penting (Terutama untuk Pengguna AppFlow)
Bagian berjudul “Mengapa Version Targeting Penting (Terutama untuk Pengguna AppFlow)”Jika Anda sudah familiar dengan Ionic AppFlow, Anda tahu betapa pentingnya memastikan pengguna hanya menerima update yang kompatibel. AppFlow otomatis mencocokkan bundle live update dengan versi app native, mencegah JavaScript yang tidak kompatibel terkirim ke code native yang lebih lama.
Capgo memberikan jaminan keamanan yang sama, dengan fitur tambahan:
- Kontrol lebih granular atas version matching
- Berbagai strategi (channels, semver, native constraints)
- Visibilitas distribusi versi yang lebih baik
- API dan CLI dikontrol bersama manajemen dashboard
Pendekatan ini sangat berguna saat:
- User Anda menggunakan versi utama app yang berbeda (misal: v1.x, v2.x, v3.x)
- Anda perlu menjaga backward compatibility saat merilis breaking changes
- Anda ingin mencegah bundle baru merusak code native yang lama
- Anda sedang melakukan migrasi user secara bertahap antar versi
- Anda sedang migrasi dari AppFlow dan ingin menjaga tingkat keamanan update yang sama
Cara Kerjanya
Bagian berjudul “Cara Kerja”Capgo menggunakan pendekatan multi-layer untuk mencocokkan user dengan update yang kompatibel:
- Batasan Versi Native: Mencegah bundle dikirim ke versi native yang tidak kompatibel
- Routing berbasis channel: Arahkan versi aplikasi yang berbeda ke channel update yang berbeda
- Kontrol Semantic Versioning: Blokir update secara otomatis pada batas major/minor/patch
- Override per perangkat: Targetkan perangkat atau grup pengguna tertentu
Alur Pencocokan Versi
Bagian berjudul “Alur pencocokan versi”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]Strategi 1: Routing Versi Berbasis Channel
Bagian berjudul “Strategi 1: Routing versi berbasis channel”Ini adalah pendekatan yang direkomendasikan untuk mengelola breaking changes dan update versi mayor. Mirip dengan model delivery AppFlow.
Contoh Skenario
Bagian berjudul “Skenario Contoh”- Aplikasi v1.x (100.000 pengguna) →
productionchannel - App v2.x (50.000 pengguna dengan breaking changes) →
v2channel - Aplikasi v3.x (10.000 beta user) →
v3channel
Implementasi
Bagian berjudul “Implementasi”Langkah 1: Konfigurasi Channel untuk Setiap Versi Major
Bagian berjudul “Langkah 1: Konfigurasi Channel untuk Setiap Versi 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 } }};Langkah 2: Buat Channel
Bagian berjudul “Langkah 2: Buat Channel”# 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-assignLangkah 3: Upload Bundle Spesifik Versi
Bagian berjudul “Langkah 3: Upload Bundle Spesifik Versi”# 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 v3Keuntungan
Bagian berjudul “Benefits”- Nol perubahan code - Routing channel berjalan otomatis
- Pemisahan yang jelas - Setiap versi punya pipeline update sendiri
- Targeting yang fleksibel - Push update ke grup versi tertentu
- Rollout yang aman - Breaking changes tidak akan mencapai versi yang tidak kompatibel
Strategi 2: Kontrol Semantic Versioning
Bagian berjudul “Strategi 2: Kontrol Semantic Versioning”Gunakan fitur bawaan Capgo kontrol semantic versioning untuk mencegah update lintas batas versi.
Nonaktifkan Auto-Update Antar Versi Major
Bagian berjudul “Matikan Auto-Update Antar Versi Major”# Create a channel that blocks major version updatesnpx @capgo/cli channel add stablenpx @capgo/cli channel set stable --disable-auto-update majorKonfigurasi ini berarti:
- User pada versi aplikasi 1.2.3 akan menerima update hingga 1.9.9
- User tidak akan TIDAK menerima versi 2.0.0 secara otomatis
- Mencegah breaking changes mencapai code native lama
- Perbandingan menggunakan baseline native yang dikirim sebagai
version_build
Opsi Kontrol Granular
Bagian berjudul “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 noneStrategi 3: Batasan Versi Native
Bagian berjudul “Strategi 3: Batasan Versi Native”Tentukan versi minimum aplikasi native (min_update_version) pada setiap bundle agar Capgo hanya mengirimkannya ke perangkat dengan binary native yang cukup baru.
Ini menggunakan channel metadata strategi (--disable-auto-update metadata) ditambah --min-update-version atau --auto-min-update-version saat upload. Tidak ada --native-version flag CLI.
Aktifkan penargetan metadata pada channel
Bagian berjudul “Aktifkan penargetan metadata pada channel”# one-time: require min_update_version metadata on uploads to this channelnpx @capgo/cli@latest channel set production --disable-auto-update metadataAtur versi native minimum saat upload
Bagian berjudul “Atur versi native minimum saat upload”Saat mengunggah bundle, tentukan versi native terendah yang boleh menerimanya:
# This bundle requires native version 2.0.0 or highernpx @capgo/cli@latest bundle upload \ --channel production \ --min-update-version "2.0.0"Atau biarkan Capgo menentukan batas minimum berdasarkan kompatibilitas package native:
npx @capgo/cli@latest bundle upload \ --channel production \ --auto-min-update-versionKasus Penggunaan
Bagian berjudul “Kasus Penggunaan”-
Native Plugin Baru Diperlukan
Jendela terminal # Bundle needs Camera plugin added in v2.0.0npx @capgo/cli@latest bundle upload \--channel production \--min-update-version "2.0.0" -
Perubahan Breaking Native API
Jendela terminal # Bundle uses new Capacitor 6 APIsnpx @capgo/cli@latest bundle upload \--channel production \--min-update-version "3.0.0" -
Migrasi Bertahap
Jendela terminal # 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"
Strategi 4: Pencegahan Auto-Downgrade
Bagian berjudul “Strategi 4: Pencegahan Auto-Downgrade”Cegah pengguna menerima bundle yang lebih lama dari versi native mereka saat ini.
Aktifkan di Pengaturan Channel
Bagian berjudul “Aktifkan di Pengaturan Channel”Di dashboard Capgo:
- Buka Channel → Pilih channel Anda
- Aktifkan “Nonaktifkan auto downgrade pada native”
- Simpan perubahan
Atau via CLI:
npx @capgo/cli@latest channel set production --no-downgrade- Perangkat user: Versi Native 1.2.5
- Bundle channel: Versi 1.2.3
- Hasil: Update diblokir (akan menjadi downgrade)
Ini berguna saat:
- User menginstal versi lebih baru secara manual dari app store
- Anda perlu memastikan user selalu mendapat patch keamanan terbaru
- Anda ingin mencegah bug regresi
Strategi 5: Targeting Tingkat Perangkat
Bagian berjudul “Strategi 5: Device-Level Targeting”Override penentuan channel untuk perangkat atau grup user tertentu.
Paksa Versi Spesifik untuk Testing
Bagian berjudul “Paksa Versi Spesifik untuk Testing”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 Device di Dashboard
Bagian berjudul “Override Device di Dashboard”Di dashboard Capgo:
- Buka Perangkat → Cari device
- Klik Atur Channel atau Atur Versi
- Override dengan channel atau versi bundle tertentu
- Device akan menerima update dari sumber yang di-override
Workflow Lengkap ala AppFlow
Bagian berjudul “Workflow ala AppFlow yang Lengkap”Berikut adalah contoh lengkap yang menggabungkan semua strategi:
1. Setup Awal (App v1.0.0)
Bagian berjudul “1. Setup Awal (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. Rilis Breaking Change (App v2.0.0)
Bagian berjudul “2. Rilis 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 Update ke Kedua Versi
Bagian berjudul “3. Push Update ke Kedua Versi”# 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. Pantau Distribusi Versi
Bagian berjudul “4. Pantau Distribusi Versi”Gunakan dashboard Capgo untuk melacak:
- Berapa banyak user di v1 vs v2
- Tingkat adopsi bundle per versi
- Error atau crash per versi
5. Deprecate versi lama
Bagian berjudul “5. Deprecate versi lama”Setelah penggunaan v1 turun di bawah threshold:
# 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)Prioritas Channel
Bagian berjudul “Prioritas Channel”Jika ada beberapa konfigurasi channel, Capgo menggunakan urutan prioritas ini:
- Override Perangkat (Dashboard atau API) - Prioritas tertinggi dan muncul di UI Device Override
- Channel plugin lokal melalui
setChannel()- Hanya tersimpan di perangkat dan tidak muncul di UI Device Override - defaultChannel di capacitor.config.ts
- Channel Default (Pengaturan Cloud) - Prioritas terendah
Praktik Terbaik
Bagian berjudul “Praktik Terbaik”1. Selalu Set defaultChannel untuk Major Versions
Bagian berjudul “1. Selalu Set defaultChannel untuk 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. Gunakan Semantic Versioning
Bagian berjudul “2. Gunakan Semantic Versioning”# ✅ Good1.0.0 → 1.0.1 → 1.1.0 → 2.0.0
# ❌ Bad1.0 → 1.1 → 2 → 2.53. Kelola Branch Terpisah
Bagian berjudul “3. Kelola Branch Terpisah”# ✅ Good: Separate branches per major versionmain (v3.x)v2-maintenance (v2.x)v1-maintenance (v1.x)
# ❌ Bad: Single branch for all versions4. Tes Sebelum Rollout
Bagian berjudul “4. Tes Sebelum 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. Pantau Distribusi Versi
Bagian berjudul “5. Pantau Distribusi Versi”Cek dashboard Anda secara rutin:
- Apakah user beralih ke versi native terbaru?
- Apakah versi lama masih menerima trafik tinggi?
- Haruskah Anda menghentikan channel lama?
Perbandingan dengan Ionic AppFlow
Bagian berjudul “Perbandingan dengan Ionic AppFlow”Bagi tim yang bermigrasi dari Ionic AppFlow, berikut perbandingan version targeting Capgo:
| Fitur | Ionic AppFlow | Capgo |
|---|---|---|
| Routing berbasis versi | Otomatis berdasarkan versi native | Otomatis via defaultChannel + berbagai strategi |
| Versioning semantik | Dukungan dasar | Lanjutan dengan --disable-auto-update (major/minor/patch) |
| Batasan versi native | Konfigurasi manual di dashboard AppFlow | Bawaan --min-update-version / --auto-min-update-version dengan metadata channels |
| Manajemen channel | Web UI + CLI | Web UI + CLI + API |
| Override perangkat | Kontrol terbatas di level device | Kontrol penuh via Dashboard/API |
| Pencegahan auto-downgrade | Ya | Ya, via --no-downgrade |
| Maintenance multi-versi | Manajemen branch/channel manual | Otomatis dengan channel precedence |
| Self-hosting | Tidak | Ya (kontrol penuh) |
| Analitik versi | Dasar | Metrik detail per versi |
Pemecahan Masalah
Bagian berjudul “Troubleshooting”User Tidak Menerima Update
Bagian berjudul “User Tidak Menerima Update”Periksa hal berikut:
-
Penetapan Channel: Pastikan device berada di channel yang benar
const channel = await CapacitorUpdater.getChannel()console.log('Current channel:', channel) -
Version Constraints: Cek apakah bundle memiliki persyaratan native version
- Dashboard → Bundles → Cek kolom “Native Version”
-
Pengaturan Semver: Verifikasi channel
disable-auto-updatepengaturanJendela terminal npx @capgo/cli channel list -
Override Perangkat: Cek apakah perangkat menggunakan manual override
- Dashboard → Devices → Cari perangkat → Cek channel/versi
Bundle Terkirim ke Versi yang Salah
Bagian berjudul “Bundle Terkirim ke Versi yang Salah”- Tinjau defaultChannel: Pastikan channel sudah benar
capacitor.config.ts - Cek Bundle Upload: Verifikasi bundle diunggah ke channel yang dituju
- Inspeksi min update version: Konfirmasi
--min-update-version(atau--auto-min-update-version) telah diatur dan channel menggunakan--disable-auto-update metadata
Breaking Changes yang Memengaruhi Versi Lama
Bagian berjudul “Breaking Changes yang Memengaruhi Versi Lama”- Solusi Cepat: Paksa perangkat yang terdampak ke bundle aman
- Dashboard → Devices → Pilih banyak → Set Version
- Solusi Jangka Panjang: Buat versioned channels dan kelola branch terpisah
- Pencegahan: Selalu uji update pada perangkat representatif sebelum rollout
Migrasi dari Ionic AppFlow
Bagian berjudul “Migrasi dari Ionic AppFlow”Jika Anda bermigrasi dari Ionic AppFlow, version targeting bekerja sangat mirip di Capgo, dengan fleksibilitas yang lebih baik:
Pemetaan Konsep
Bagian berjudul “Pemetaan Konsep”| Konsep AppFlow | Ekuivalen Capgo | Catatan |
|---|---|---|
| Deploy Channel | Channel Capgo | Konsep sama, lebih powerful |
| Kunci Versi Native | --min-update-version / --auto-min-update-version | Kontrol lebih granular |
| Prioritas Channel | Precedence channel (override → cloud → default) | Precedence lebih transparan |
| Target Deployment | Kontrol Channel + semver | Tersedia berbagai strategi |
| Channel Produksi | production channel (atau nama apa pun) | Penamaan fleksibel |
| Deployment berbasis Git | upload CLI bundle dari branch | Workflow yang sama |
| Pencocokan versi otomatis | defaultChannel + batasan versi | Ditingkatkan dengan berbagai strategi |
Perbedaan Utama bagi Pengguna AppFlow
Bagian berjudul “Perbedaan Utama bagi Pengguna AppFlow”- Kontrol Lebih Besar: Capgo memberi Anda berbagai strategi (channels, semver, native version) yang bisa dikombinasikan
- Visibilitas Lebih Baik: Dashboard menampilkan distribusi versi dan masalah kompatibilitas
- Akses API: Kontrol programatik penuh atas targeting versi
- Hosting Sendiri: Opsi menjalankan server update sendiri dengan logika versi yang sama
Langkah Migrasi
Bagian berjudul “Langkah Migrasi”- Petakan channel AppFlow Anda ke channel Capgo (biasanya 1:1)
- Atur
defaultChanneldicapacitor.config.tsuntuk setiap versi mayor - Konfigurasi aturan semver jika ingin pemblokiran otomatis pada batas versi
- Upload bundle spesifik versi menggunakan
--min-update-version(channel harus menggunakan strategi metadata) - Pantau distribusi versi di dashboard Capgo
Pola Lanjutan
Bagian berjudul “Advanced Patterns”Gradual Rollout per Versi
Bagian berjudul “Gradual Rollout per Versi”// 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 per Versi
Bagian berjudul “Feature Flags per Versi”// 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 Antar Versi
Bagian berjudul “A/B Testing Antar Versi”// 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 }) }}Ringkasan
Bagian berjudul “Ringkasan”Capgo menyediakan berbagai strategi pengiriman update spesifik versi:
- Routing berbasis channel: Pemisahan versi otomatis via
defaultChannel - Semantic Versioning: Mencegah update antar batas major/minor/patch
- Batasan Versi Native: Syarat minimum versi native untuk bundle
- Pencegahan Auto-Downgrade: Tidak akan mengirim bundle lama ke versi native baru
- Override Perangkat: Kontrol manual untuk testing dan targeting
Dengan menggabungkan strategi ini, Anda bisa mendapatkan pengiriman update otomatis ala AppFlow dengan fleksibilitas dan kontrol yang lebih tinggi. Pilih pendekatan yang paling sesuai dengan workflow versioning dan deployment aplikasi Anda.
Untuk detail lebih lanjut mengenai fitur spesifik:
- Panduan Breaking Changes - Strategi versioning channel mendalam
- Manajemen Channel - Referensi konfigurasi channel lengkap
- Perilaku Update - Delay dan kondisi Native Build
Lanjutkan dari Version Targeting
Bagian berjudul “Keep going from Version Targeting”Jika Anda menggunakan Targeting Versi untuk merencanakan routing channel dan staged rollout, hubungkan dengan Channel untuk detail implementasi di Channels, Channel untuk detail implementasi di Channels, Channel untuk detail implementasi di Channels, Solusi Beta Testing untuk workflow produk di Solusi Beta Testing, dan Solusi Version Targeting untuk workflow produk di Version Targeting Solution.