バージョンターゲティング
インストール手順と、このプラグインの完全なMarkdownガイドを含むセットアッププロンプトをコピーします。
このガイドでは、ユーザーのネイティブアプリのバージョンに基づいて、互換性のある最新の bundle を自動的に配信する方法を説明します。 Ionic AppFlow のアプローチと同様です。これにより、アップデート管理が簡素化され、ロールアウトが迅速化され、互換性の問題も防げます。
Capgoのバージョンターゲティング機能により、以下が可能になります:
- 互換性のあるアップデートの自動配信 ユーザーのネイティブアプリのバージョンに基づいた配信
- 破壊的変更の防止 互換性のないアプリバージョンへの配信を回避
- 複数のアプリバージョンの管理 複雑なロジックなしで同時に管理
- アップデートをシームレスに配信 特定のユーザーセグメントへ
バージョンターゲティングが重要な理由(特にAppFlowユーザーにとって)
セクション「バージョンターゲティングが重要な理由(特にAppFlowユーザー向け)」もしあなたが Ionic AppFlowに馴染みがあれば、ユーザーに互換性のあるアップデートのみを確実に届けることがいかに重要か、ご存じでしょう。AppFlowは live update bundle をネイティブアプリのバージョンに自動でマッチさせ、古いネイティブ code に互換性のないJavaScriptが配信されるのを防いでいました。
Capgo は同じ安全性を保証しますが、さらに以下の機能も備えています:
- バージョンマッチングをより細かく制御
- 複数の戦略(チャネル、semver、ネイティブ制約)
- バージョン配信状況の可視性向上
- API と CLI は、ダッシュボード管理と併せて制御されます
この手法は、特に以下のような場合に有効です:
- アプリのメジャーバージョンが複数に分かれている場合(例:v1.x, v2.x, v3.x)
- 破壊的変更を導入しつつ、後方互換性を維持する必要がある場合
- 新しいbundle が古い Native code を壊すのを防ぎたい場合
- ユーザーをあるバージョンから別のバージョンへ段階的に移行させる場合
- AppFlow からの移行を行っている場合 かつ、これまでと同様のアップデートの安全性を維持したい場合
仕組み
「仕組み」セクションCapgo は、ユーザーに互換性のあるアップデートを配信するために多層的なアプローチを採用しています:
- Native バージョン制約: 非互換な Native Build バージョンへの bundle 送信を防止します
- チャンネルベースのルーティング: アプリのバージョンごとに異なるアップデート用チャンネルへルーティングします
- セマンティックバージョニングによる制御: メジャー/マイナー/パッチの境界を越えるアップデートを自動的にブロックします
- デバイスレベルのオーバーライド: 特定のデバイスやユーザーグループをターゲットにします
バージョンマッチングのフロー
「バージョンマッチングフロー」セクション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]戦略1:チャネルベースのバージョンルーティング
「戦略 1: チャンネルベースのバージョンルーティング」セクションこれは 推奨される手法です 破壊的変更やメジャーバージョンの更新を管理するためのものです。AppFlowのデリバリーモデルに似ています。
シナリオ例
「シナリオ例」セクション- アプリ v1.x (ユーザー数 100,000人) →
productionチャンネル - アプリ v2.x (破壊的変更を含むユーザー数 50,000人) →
v2チャンネル - アプリ v3.x (ベータユーザー 10,000人) →
v3チャンネル
実装方法
「実装」セクションステップ 1: メジャーバージョンごとに Channel を設定する
「ステップ 1: メジャーバージョンごとに Channel を設定する」というタイトルのセクション// 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 } }};ステップ 2: Channel を作成する
「ステップ 2: 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-assignステップ 3: バージョン固有の Bundle をアップロード
「ステップ 3: バージョン固有の Bundle をアップロード」というセクション# 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メリット
「メリット」というセクション- code の変更は不要 - チャネルルーティングは自動で行われます
- 明確な分離 - 各バージョンに独自のアップデートパイプラインがあります
- 柔軟なターゲティング - 特定のバージョングループにアップデートを配信
- 安全なロールアウト - 破壊的変更が互換性のないバージョンに届くことはありません
戦略2:セマンティックバージョニングの制御
セクション見出し:「戦略 2: セマンティックバージョニング制御」Capgo の組み込みの セマンティックバージョニング制御を 使用して、バージョン境界を越えたアップデートを防ぎます。
メジャーバージョン間での自動アップデートを無効化
「メジャーバージョン間の自動アップデートを無効にする」セクション# Create a channel that blocks major version updatesnpx @capgo/cli channel add stablenpx @capgo/cli channel set stable --disable-auto-update majorこの設定の意味:
- アプリバージョン 1.2.3 のユーザーは、次までのアップデートを受け取ります: 1.9.9
- ユーザーは 決して バージョン 2.0.0 を自動的には受け取りません
- 古いネイティブ code に破壊的変更が及ぶのを防ぎます
- 比較には、送信された以下の Native baseline が使用されます:
version_build
きめ細かい制御オプション
「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 none戦略 3: Native Version Constraints
「戦略 3: Native Version Constraints」セクション各bundleに最小ネイティブアプリバージョン(min_update_version) を指定することで、Capgo はネイティブバイナリが要件を満たすデバイスにのみ配信されます。
これは、 metadata 戦略(--disable-auto-update metadata) と、 --min-update-version または --auto-min-update-version アップロード時に。 --native-version CLI フラグ。
チャンネルでmetadata targetingを有効にする
「チャンネルでmetadata targetingを有効にする」セクション# one-time: require min_update_version metadata on uploads to this channelnpx @capgo/cli@latest channel set production --disable-auto-update metadataアップロード時に最小ネイティブバージョンを設定する
「アップロード時に最小ネイティブバージョンを設定する」というセクションbundleをアップロードする際、そのbundleを受け取れる最小のネイティブバージョンを指定します:
# This bundle requires native version 2.0.0 or highernpx @capgo/cli@latest bundle upload \ --channel production \ --min-update-version "2.0.0"または、ネイティブパッケージの互換性に基づいて Capgo に下限を設定させることもできます:
npx @capgo/cli@latest bundle upload \ --channel production \ --auto-min-update-versionユースケース
「ユースケース」という見出しのセクション-
新しいネイティブプラグインが必要な場合
ターミナル # Bundle needs Camera plugin added in v2.0.0npx @capgo/cli@latest bundle upload \--channel production \--min-update-version "2.0.0" -
ネイティブ API の破壊的変更
ターミナル # Bundle uses new Capacitor 6 APIsnpx @capgo/cli@latest bundle upload \--channel production \--min-update-version "3.0.0" -
段階的な移行
ターミナル # 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"
戦略 4: 自動ダウングレードの防止
「戦略 4: 自動ダウングレードの防止」というセクションユーザーが現在の Native Build バージョンよりも古い bundle を受信するのを防ぎます。
Channel Settings で有効にする
「Channel Settings で有効にする」というセクションCapgo ダッシュボードにて:
- 以下に移動します: チャンネル → チャネルを選択
- 有効にする “Native での自動ダウングレードを無効にする”
- 変更を保存
または CLI 経由:
npx @capgo/cli@latest channel set production --no-downgrade- ユーザーのデバイス: Native バージョン 1.2.5
- チャネル bundle: バージョン 1.2.3
- 実績: アップデートがブロックされました(ダウングレードになるため)
以下のようなケースで有効です:
- ユーザーがApp Storeから手動で新しいバージョンをインストールした場合
- 常に最新のセキュリティパッチをユーザーに適用させたい場合
- デグレ(先祖返り)によるバグを防ぎたい場合
戦略 5: デバイスレベルのターゲティング
「戦略 5: デバイスレベルのターゲティング」というセクション特定のデバイスやユーザーグループに対して、チャンネル割り当てを上書きします。
テスト用に特定のバージョンを強制する
「テスト用に特定のバージョンを強制する」というセクション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' }) }}ダッシュボードでのデバイス上書き設定
「Dashboard Device Override」セクションCapgo ダッシュボードにて:
- 以下に移動します: デバイス → デバイスを検索
- クリック Channel を設定 または Version を設定
- 特定の channel または bundle version で上書き
- デバイスは上書きされたソースからアップデートを受信します
AppFlowスタイルの完全なワークフロー
「AppFlowスタイルの完全なワークフロー」というセクションすべての戦略を組み合わせた完全な例はこちらです:
1. 初期セットアップ (App v1.0.0)
「1. 初期セットアップ (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. 破壊的変更をリリース (App v2.0.0)
「2. 破壊的変更をリリースする (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. 両方のバージョンにアップデートをプッシュ
「3. 両方のバージョンにアップデートをプッシュする」セクション# 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. バージョンごとの配信状況を監視
「4. バージョン分布を監視する」セクションCapgo ダッシュボードで以下を追跡します:
- v1とv2のユーザー数比較
- バージョンごとのBundle採用率
- バージョンごとのエラー・クラッシュ発生数
5. 旧バージョンの非推奨化
「5. 旧バージョンの廃止」セクションv1の利用率が閾値を下回った場合:
# 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の優先順位」セクション複数のChannel設定が存在する場合、Capgo は以下の優先順位に従います:
- デバイスオーバーライド (Dashboard または API) - 最優先。Device Override UI に表示されます
- ローカルのプラグインチャンネル 経由で
setChannel()- デバイス内にのみ保存され、Device Override UI には表示されません - defaultChannel capacitor.config.ts 内
- デフォルトチャンネル (Cloud 設定) - 最低優先度
ベストプラクティス
「ベストプラクティス」セクション1. メジャーバージョンでは必ずdefaultChannelを設定する
セクション「1. メジャーバージョンでは必ずdefaultChannelを設定する」// ✅ 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. セマンティックバージョニングを使う
セクション「2. セマンティックバージョニングを使う」# ✅ Good1.0.0 → 1.0.1 → 1.1.0 → 2.0.0
# ❌ Bad1.0 → 1.1 → 2 → 2.53. 別々のブランチを維持
「3. ブランチを分けて管理する」セクション# ✅ Good: Separate branches per major versionmain (v3.x)v2-maintenance (v2.x)v1-maintenance (v1.x)
# ❌ Bad: Single branch for all versions4. ロールアウト前にテストを行う
「4. リリース前にテストする」セクション# 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. バージョンごとの配信状況を監視
「5. バージョン配布状況を監視する」セクション定期的にダッシュボードを確認してください:
- ユーザーは新しい Native Build へ移行していますか?
- 古いバージョンに依然として高いトラフィックがありますか?
- 古いチャンネルを廃止すべきでしょうか?
Ionic AppFlowとの比較
「Ionic AppFlow との比較」セクション以下の環境から移行するチーム向け: Ionic AppFlow、Capgo のバージョン・ターゲティングとの比較は以下の通りです:
| 機能 | Ionic AppFlow | Capgo |
|---|---|---|
| バージョンベースのルーティング | ネイティブバージョンに基づき自動設定 | 〜経由で自動設定 defaultChannel + 複数の戦略 |
| セマンティックバージョニング | 基本サポート | 〜による高度な設定 --disable-auto-update (メジャー/マイナー/パッチ) |
| ネイティブバージョンの制約 | AppFlowダッシュボードでの手動設定 | 組み込み済み --min-update-version / --auto-min-update-version メタデータチャネル付き |
| チャネル管理 | Web UI + CLI | Web UI + CLI + API |
| デバイスオーバーライド | デバイス単位の制御は限定的 | Dashboard/API でフルコントロール |
| 自動ダウングレード防止 | はい | はい(経由) --no-downgrade |
| 複数バージョンのメンテナンス | 手動でのブランチ/チャネル管理 | チャネル優先度による自動化 |
| セルフホスティング | いいえ | はい(完全な制御が可能) |
| バージョン分析 | 基本 | バージョンごとの詳細なメトリクス |
トラブルシューティング
「トラブルシューティング」セクションユーザーにアップデートが届かない
「アップデートが届かない場合」セクション以下の項目を確認してください:
-
チャンネルの割り当て: デバイスが正しいチャンネルに設定されているか確認
const channel = await CapacitorUpdater.getChannel()console.log('Current channel:', channel) -
バージョンの制約: bundle に Native Build のバージョン要件が含まれているか確認
- Dashboard → Bundles → “Native Version” 列を確認
-
Semver 設定: チャンネルの
disable-auto-update設定ターミナル npx @capgo/cli channel list -
デバイスオーバーライド: デバイスに手動オーバーライドが設定されているか確認
- Dashboard → Devices → デバイスを検索 → channel/versionを確認
Bundleが誤ったバージョンに配信される
「Bundleが誤ったバージョンに配信された」セクション- defaultChannelを確認: 正しいchannelが指定されているか確認
capacitor.config.ts - Bundleのアップロードを確認: bundleが意図したchannelにアップロードされたか確認
- min update versionを確認: 確認
--min-update-version(または--auto-min-update-version) が設定されており、そのチャンネルは使用しています--disable-auto-update metadata
破壊的変更が旧バージョンに影響する
「旧バージョンに影響する破壊的変更」セクション- 即時対応: 対象デバイスを安全なbundleに上書きする
- Dashboard → Devices → 一括選択 → Set Version
- 恒久的な対策: バージョンごとのチャンネルを作成し、ブランチを分けて管理する
- 予防: リリース前に、必ず代表的なデバイスでアップデートのテストを行う
Ionic AppFlowからの移行
「Ionic AppFlowからの移行」セクションもし以下から移行する場合、 Ionic AppFlow、Capgo のバージョンターゲティングも非常に似た仕組みですが、より柔軟性が向上しています:
コンセプトの対応表
「コンセプトのマッピング」セクション| AppFlowのコンセプト | Capgo での相当する機能 | 備考 |
|---|---|---|
| デプロイ先チャンネル | Capgo チャンネル | コンセプトは同じ、より強力に |
| Native Version Lock | --min-update-version / --auto-min-update-version | より細かな制御が可能に |
| チャンネルの優先度 | Channelの優先順位 (override → cloud → default) | より明確な優先順位 |
| デプロイ先ターゲット | Channel + semver による制御 | 複数の戦略を利用可能 |
| 本番チャンネル | production channel (または任意の名前) | 柔軟な命名 |
| Gitベースのデプロイ | ブランチからのCLI bundle upload | 同一のワークフロー |
| バージョンの自動マッチング | defaultChannel + バージョン制約 | 複数の戦略で機能を強化 |
AppFlowユーザー向けの主な違い
「AppFlowユーザーとの主な違い」セクション- より高度なコントロール: Capgo では、組み合わせ可能な複数の戦略(channels、semver、native version)を利用できます
- 優れた可視性: ダッシュボードでバージョンの分布や互換性の問題を把握できます
- API へのアクセス: バージョン指定を完全にプログラム制御
- セルフホスティング: 同様のバージョンロジックを持つ自社更新サーバーの運用オプション
移行手順
「移行ステップ」セクション- AppFlow のチャンネルを Capgo のチャンネルにマッピング(通常は 1:1)
- 設定
defaultChannelにおけるcapacitor.config.tsメジャーバージョンごとに - semver ルールの設定 バージョン境界での自動ブロックを行いたい場合
- バージョン固有のbundleをアップロードする を使用して
--min-update-version(channelはmetadata戦略を使用する必要があります) - バージョンの配信状況をモニタリングする Capgoのダッシュボードで
バージョンごとの段階的ロールアウト
「バージョンによる段階的なロールアウト」セクション// 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
「バージョンごとのフィーチャーフラグ」セクション// 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テスト
「バージョン間でのA/Bテスト」セクション// 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 }) }}まとめ
「概要」セクションCapgo は、バージョンごとに最適化されたアップデート配信のための複数の戦略を提供します:
- チャンネルベースのルーティング: Automatic version separation via
defaultChannel - セマンティックバージョニング: メジャー/マイナー/パッチ境界を越えたアップデートを防止
- ネイティブバージョンの制約: バンドルに最小ネイティブバージョンを要求
- 自動ダウングレードの防止: 新しいネイティブバージョンに古いバンドルを配信しない
- デバイスの上書き設定: テストやターゲット指定のための手動制御
これらの戦略を組み合わせることで、AppFlowのような自動アップデート配信を、より高い柔軟性とコントロール性で実現できます。アプリのバージョニングやデプロイワークフローに最適なアプローチを選択してください。
各機能の詳細についてはこちら:
Version Targetingの次のステップ
「Version Targetingの次のステップ」というセクション使用している場合 バージョンターゲティング チャンネルルーティングと段階的ロールアウトを計画するには、次と組み合わせてください: チャンネル Channelsの実装の詳細については、 チャンネル Channelsの実装の詳細については、 チャンネル Channelsの実装の詳細については、 ベータテストソリューション ベータテストソリューションのプロダクトワークフロー向け、および バージョンターゲティングソリューション バージョンターゲティングソリューションのプロダクトワークフロー向け。