バージョンターゲティング
このガイドでは、ネイティブアプリのバージョンに基づいて、ユーザーに最新の互換性のあるバンドルを自動的に配信する方法について説明します。Ionic AppFlowのアプローチに似ています。これにより、アップデート管理が簡素化され、より迅速なロールアウトが可能になり、互換性の問題を防ぐことができます。
Capgoのバージョンターゲティングシステムでは、以下のことが可能です:
- ネイティブアプリのバージョンに基づいて、互換性のあるアップデートを自動的に配信
- 破壊的な変更が互換性のないアプリバージョンに到達するのを防止
- 複数のアプリバージョンを同時に管理し、複雑なロジックなしで実現
- アップデートをシームレスに特定のユーザーセグメントにロールアウト
バージョンターゲティングが重要な理由(AppFlowユーザーの場合は特に)
Section titled “バージョンターゲティングが重要な理由(AppFlowユーザーの場合は特に)”Ionic AppFlowに精通している場合、ユーザーが互換性のあるアップデートのみを受け取ることを確認することがいかに重要であるかご存知でしょう。AppFlowはライブアップデートバンドルをネイティブアプリバージョンに自動的にマッチングし、互換性のないJavaScriptが古いネイティブコードに配信されるのを防ぎました。
Capgoは同じセキュリティ保証を提供し、追加機能があります:
- バージョンマッチングのより細かい制御
- 複数の戦略(チャネル、semver、ネイティブ制約)
- バージョン配布の可視性向上
- ダッシュボード管理と並行してAPIおよびCLI制御
このアプローチは以下の場合に特に有用です:
- アプリの異なるメジャーバージョンにユーザーがいる場合(例: v1.x、v2.x、v3.x)
- 破壊的な変更を展開しながら下位互換性を維持する必要がある場合
- 新しいバンドルが古いネイティブコードを破壊するのを防ぎたい場合
- ユーザーをある程度から段階的に別のバージョンに移行する場合
- AppFlowから移行し、同じアップデートセキュリティを維持したい場合
Capgoは、多層アプローチを使用してユーザーを互換性のあるアップデートにマッチングさせます:
- ネイティブバージョン制約: 互換性のないネイティブバージョンへのバンドル配信を防止
- チャネルベースのルーティング: 異なるアプリバージョンを異なるアップデートチャネルにルート
- セマンティックバージョニング制御: メジャー/マイナー/パッチ境界を超えるアップデートを自動的にブロック
- デバイスレベルのオーバーライド: 特定のデバイスまたはユーザーグループをターゲット化
バージョンマッチングフロー
Section titled “バージョンマッチングフロー”graph TD A[User Opens App] --> B{Check Device Override} B -->|Override Set| C[Use Override Channel] B -->|No Override| D{Check defaultChannel in App} D -->|Has defaultChannel| E[Use App's defaultChannel] D -->|No defaultChannel| F[Use Cloud Default Channel] C --> G{Check Version Constraints} E --> G F --> G G -->|Compatible| H[Deliver Update] G -->|Incompatible| I[Skip Update]戦略1: チャネルベースのバージョンルーティング
Section titled “戦略1: チャネルベースのバージョンルーティング”これは、破壊的な変更とメジャーバージョン更新を管理するための推奨アプローチです。AppFlowの配信モデルに似ています。
サンプルシナリオ
Section titled “サンプルシナリオ”- App v1.x (100,000ユーザー) →
productionチャネル - App v2.x (50,000ユーザー、破壊的な変更付き) →
v2チャネル - App v3.x (10,000ベータユーザー) →
v3チャネル
ステップ1: 各メジャーバージョンのチャネルを構成
Section titled “ステップ1: 各メジャーバージョンのチャネルを構成”// バージョン1.xビルドのcapacitor.config.tsimport { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = { appId: 'com.example.app', appName: 'Example App', plugins: { CapacitorUpdater: { autoUpdate: true, defaultChannel: 'production', // またはデフォルト設定を省略 } }};
export default config;// バージョン2.xビルドのcapacitor.config.tsconst config: CapacitorConfig = { appId: 'com.example.app', appName: 'Example App', plugins: { CapacitorUpdater: { autoUpdate: true, defaultChannel: 'v2', // v2ユーザーを自動的にルート } }};// バージョン3.xビルドのcapacitor.config.tsconst config: CapacitorConfig = { appId: 'com.example.app', appName: 'Example App', plugins: { CapacitorUpdater: { autoUpdate: true, defaultChannel: 'v3', // v3ユーザーを自動的にルート } }};ステップ2: チャネルを作成
Section titled “ステップ2: チャネルを作成”# 各メジャーバージョン用のチャネルを作成npx @capgo/cli channel create productionnpx @capgo/cli channel create v2npx @capgo/cli channel create v3
# アプリがチャネルを切り替えられるようにセルフアサインを有効化npx @capgo/cli channel set production --self-assignnpx @capgo/cli channel set v2 --self-assignnpx @capgo/cli channel set v3 --self-assignステップ3: バージョン固有のバンドルをアップロード
Section titled “ステップ3: バージョン固有のバンドルをアップロード”# v1.xユーザー用(v1-maintenanceブランチから)git checkout v1-maintenancenpm run buildnpx @capgo/cli bundle upload --channel production
# v2.xユーザー用(v2-maintenanceまたはmainブランチから)git checkout mainnpm run buildnpx @capgo/cli bundle upload --channel v2
# v3.xユーザー用(beta/v3ブランチから)git checkout betanpm run buildnpx @capgo/cli bundle upload --channel v3- コード変更ゼロ - チャネルルーティングは自動的に行われます
- 明確な分離 - 各バージョンに独自のアップデートパイプラインがあります
- 柔軟なターゲティング - 特定のバージョングループにアップデートを配信
- 安全なロールアウト - 破壊的な変更は決して互換性のないバージョンに到達しません
戦略2: セマンティックバージョニング制御
Section titled “戦略2: セマンティックバージョニング制御”Capgoの組み込みセマンティックバージョニング制御を使用して、バージョン境界を超えるアップデートを防止します。
メジャーバージョン間の自動アップデートを無効化
Section titled “メジャーバージョン間の自動アップデートを無効化”# メジャーバージョン更新をブロックするチャネルを作成npx @capgo/cli channel create stable --disable-auto-update majorこの設定は以下を意味します:
- アプリバージョン1.2.3のユーザーは1.9.9までのアップデートを受け取ります
- ユーザーは自動的にバージョン2.0.0を受け取りません
- 破壊的な変更が古いネイティブコードに到達するのを防ぎます
細かい制御オプション
Section titled “細かい制御オプション”# マイナーバージョン更新をブロック(1.2.xは1.3.0を取得しません)npx @capgo/cli channel set stable --disable-auto-update minor
# パッチ更新をブロック(1.2.3は1.2.4を取得しません)npx @capgo/cli channel set stable --disable-auto-update patch
# すべてのアップデートを許可npx @capgo/cli channel set stable --disable-auto-update none戦略3: ネイティブバージョン制約
Section titled “戦略3: ネイティブバージョン制約”バンドルのミニバージョン要件を指定して、互換性のないデバイスへの配信を防止します。
nativeVersionディレイ条件の使用
Section titled “nativeVersionディレイ条件の使用”バンドルをアップロードするときに、最小ネイティブバージョンを指定できます:
# このバンドルはネイティブバージョン2.0.0以上を必要としますnpx @capgo/cli bundle upload \ --channel production \ --native-version "2.0.0"ユースケース
Section titled “ユースケース”-
新しいネイティブプラグインが必要
Terminal window # バンドルはv2.0.0でカメラプラグインが追加されている必要がありますnpx @capgo/cli bundle upload --native-version "2.0.0" -
ネイティブAPI変更の破壊
Terminal window # バンドルは新しいCapacitor 6 APIを使用しますnpx @capgo/cli bundle upload --native-version "3.0.0" -
段階的移行
Terminal window # バンドルを最新のネイティブバージョンのみでテストnpx @capgo/cli bundle upload \--channel beta \--native-version "2.5.0"
戦略4: 自動ダウングレード防止
Section titled “戦略4: 自動ダウングレード防止”ユーザーが現在のネイティブバージョンより古いバンドルを受け取るのを防止します。
チャネル設定で有効化
Section titled “チャネル設定で有効化”Capgoダッシュボードで:
- チャネル → チャネルを選択
- ネイティブ下の自動ダウングレードを無効化を有効化
- 変更を保存
またはCLI経由:
npx @capgo/cli channel set production --disable-downgrade- ユーザーのデバイス: ネイティブバージョン1.2.5
- チャネルバンドル: バージョン1.2.3
- 結果: アップデートがブロック(ダウングレードになります)
これは以下の場合に有用です:
- ユーザーが手動でアプリストアからより新しいバージョンをインストールした場合
- ユーザーが常に最新のセキュリティパッチを持つことを確認する必要がある場合
- 回帰バグを防ぎたい場合
戦略5: デバイスレベルのターゲティング
Section titled “戦略5: デバイスレベルのターゲティング”特定のデバイスまたはユーザーグループのチャネル割り当てをオーバーライドします。
テスト用の特定バージョンを強制
Section titled “テスト用の特定バージョンを強制”import { CapacitorUpdater } from '@capgo/capacitor-updater'
// ベータテスターをv3チャネルに強制async function assignBetaTesters() { const deviceId = await CapacitorUpdater.getDeviceId()
// ユーザーがベータテスターであるかチェック if (isBetaTester(userId)) { await CapacitorUpdater.setChannel({ channel: 'v3' }) }}ダッシュボードデバイスオーバーライド
Section titled “ダッシュボードデバイスオーバーライド”Capgoダッシュボードで:
- デバイス → デバイスを見つける
- チャネルを設定またはバージョンを設定をクリック
- 特定のチャネルまたはバンドルバージョンでオーバーライド
- デバイスはオーバーライドされたソースからアップデートを受け取ります
完全なAppFlowスタイルワークフロー
Section titled “完全なAppFlowスタイルワークフロー”以下は、すべての戦略を組み合わせた完全な例です:
1. 初期設定(App v1.0.0)
Section titled “1. 初期設定(App v1.0.0)”# semver制御を備えたproductionチャネルを作成npx @capgo/cli channel create production \ --disable-auto-update major \ --disable-downgradeconst config: CapacitorConfig = { plugins: { CapacitorUpdater: { autoUpdate: true, defaultChannel: 'production', } }};2. 破壊的な変更をリリース(App v2.0.0)
Section titled “2. 破壊的な変更をリリース(App v2.0.0)”# 新しいバージョンのv2チャネルを作成npx @capgo/cli channel create v2 \ --disable-auto-update major \ --disable-downgrade \ --self-assign
# v1メンテナンス用のgitブランチを作成git checkout -b v1-maintenancegit push origin v1-maintenance// v2.0.0のcapacitor.config.tsconst config: CapacitorConfig = { plugins: { CapacitorUpdater: { autoUpdate: true, defaultChannel: 'v2', // 新しいユーザーはv2チャネルを取得 } }};3. 両方のバージョンにアップデートをプッシュ
Section titled “3. 両方のバージョンにアップデートをプッシュ”# v1.xユーザーを更新(バグ修正)git checkout v1-maintenance# 変更を加えるnpx @capgo/cli bundle upload \ --channel production \ --native-version "1.0.0"
# v2.xユーザーを更新(新機能)git checkout main# 変更を加えるnpx @capgo/cli bundle upload \ --channel v2 \ --native-version "2.0.0"4. バージョン配布を監視
Section titled “4. バージョン配布を監視”Capgoダッシュボードを使用して以下を追跡:
- v1対v2のユーザー数
- バージョンごとのバンドル採用率
- バージョンごとのエラーまたはクラッシュ
5. 古いバージョンを非推奨
Section titled “5. 古いバージョンを非推奨”v1の使用がしきい値を下回った場合:
# productionチャネルへのアップロードを停止# オプション: v1メンテナンスブランチを削除git branch -d v1-maintenance
# 残りのすべてのユーザーをデフォルトに移動# (アプリストア経由で更新する必要があります)チャネルプリセデンス
Section titled “チャネルプリセデンス”複数のチャネル構成が存在する場合、Capgoはこの優先順位を使用します:
- デバイスオーバーライド (ダッシュボードまたはAPI) - 最優先
- クラウドオーバーライド via
setChannel()呼び出し - defaultChannel in capacitor.config.ts
- デフォルトチャネル (クラウド設定) - 最低優先
ベストプラクティス
Section titled “ベストプラクティス”1. メジャーバージョンのdefaultChannelを常に設定
Section titled “1. メジャーバージョンのdefaultChannelを常に設定”// ✅ 良い: 各メジャーバージョンに明示的なチャネルがあります// v1.x → production// v2.x → v2// v3.x → v3
// ❌ 悪い: 動的チャネル切り替えに依存// すべてのバージョン → production、手動で切り替え2. セマンティックバージョニングを使用
Section titled “2. セマンティックバージョニングを使用”# ✅ 良い1.0.0 → 1.0.1 → 1.1.0 → 2.0.0
# ❌ 悪い1.0 → 1.1 → 2 → 2.53. 独立したブランチを維持
Section titled “3. 独立したブランチを維持”# ✅ 良い: メジャーバージョンごとに別のブランチmain (v3.x)v2-maintenance (v2.x)v1-maintenance (v1.x)
# ❌ 悪い: すべてのバージョン用の単一ブランチ4. ロールアウト前にテスト
Section titled “4. ロールアウト前にテスト”# 最初にベータチャネルでテストnpx @capgo/cli bundle upload --channel beta
# 問題を監視してからproductionに昇格npx @capgo/cli bundle upload --channel production5. バージョン配布を監視
Section titled “5. バージョン配布を監視”定期的にダッシュボードを確認してください:
- ユーザーは新しいネイティブバージョンにアップグレードしていますか?
- 古いバージョンはまだ多くのトラフィックを取得していますか?
- 古いチャネルを非推奨にする必要がありますか?
Ionic AppFlowとの比較
Section titled “Ionic AppFlowとの比較”Ionic AppFlowから移行しているチームの場合、Capgoのバージョンターゲティングの比較は次の通りです:
| 機能 | Ionic AppFlow | Capgo |
|---|---|---|
| バージョンベースのルーティング | ネイティブバージョンに基づく自動 | defaultChannel +複数の戦略による自動 |
| セマンティックバージョニング | 基本的なサポート | --disable-auto-update (major/minor/patch)による高度なもの |
| ネイティブバージョン制約 | AppFlowダッシュボードでの手動設定 | CLIの組み込み--native-versionフラグ |
| チャネル管理 | Web UI + CLI | Web UI + CLI + API |
| デバイスオーバーライド | 限定的なデバイスレベル制御 | ダッシュボード/API経由の完全制御 |
| 自動ダウングレード防止 | はい | --disable-downgrade経由ではい |
| マルチバージョン保守 | 手動ブランチ/チャネル管理 | チャネルプリセデンスを使用した自動化 |
| セルフホスティング | いいえ | はい(完全制御) |
| バージョン分析 | 基本的 | バージョンごとの詳細メトリクス |
トラブルシューティング
Section titled “トラブルシューティング”ユーザーがアップデートを受け取らない
Section titled “ユーザーがアップデートを受け取らない”以下を確認してください:
-
チャネル割り当て: デバイスが正しいチャネルにあることを確認
const channel = await CapacitorUpdater.getChannel()console.log('Current channel:', channel) -
バージョン制約: バンドルがネイティブバージョン要件を持つかどうか確認
- ダッシュボード → バンドル → “ネイティブバージョン”列を確認
-
Semver設定: チャネルの
disable-auto-update設定を確認Terminal window npx @capgo/cli channel list -
デバイスオーバーライド: デバイスに手動オーバーライドがあるかどうか確認
- ダッシュボード → デバイス → デバイスを検索 → チャネル/バージョンを確認
間違ったバージョンに配信されるバンドル
Section titled “間違ったバージョンに配信されるバンドル”- defaultChannelを確認:
capacitor.config.tsで正しいチャネルを確認 - バンドルアップロードを確認: バンドルが目的のチャネルにアップロードされたことを確認
- ネイティブバージョンを確認:
--native-versionフラグが正しく使用されたことを確認
古いバージョンに影響を与える破壊的な変更
Section titled “古いバージョンに影響を与える破壊的な変更”- 即座の修正: 影響を受けたデバイスを安全なバンドルでオーバーライド
- ダッシュボード → デバイス → 複数選択 → バージョンを設定
- 長期的な修正: バージョンチャネルを作成し、独立したブランチを維持
- 予防: ロールアウト前に代表的なデバイスでアップデートを常にテストしてください
Ionic AppFlowからの移行
Section titled “Ionic AppFlowからの移行”Ionic AppFlowから移行する場合、バージョンターゲティングはCapgoで非常に似たように動作し、柔軟性が向上しています:
| AppFlow概念 | Capgo相当 | 注記 |
|---|---|---|
| デプロイチャネル | Capgoチャネル | 同じ概念、より強力 |
| ネイティブバージョンロック | --native-versionフラグ | よりきめ細かい制御 |
| チャネルプリオリティ | チャネルプリセデンス(オーバーライド→クラウド→デフォルト) | より透過的なプリセデンス |
| デプロイメントターゲット | チャネル + semver制御 | 複数の戦略が利用可能 |
| Productionチャネル | productionチャネル(任意の名前) | 柔軟な命名 |
| Gitベースのデプロイメント | ブランチからのCLIバンドルアップロード | 同じワークフロー |
| 自動バージョンマッチング | defaultChannel +バージョン制約 | 複数の戦略で強化 |
AppFlowユーザーの主な違い
Section titled “AppFlowユーザーの主な違い”- より多くの制御: Capgoは複数の戦略(チャネル、semver、ネイティブバージョン)を提供し、組み合わせることができます
- より良い可視性: ダッシュボードはバージョン配布と互換性の問題を表示します
- APIアクセス: バージョンターゲティングに対する完全なプログラマティック制御
- セルフホスティング: 同じバージョンロジックで独自のアップデートサーバーを実行するオプション
- AppFlowチャネルをCapgoチャネルにマッピング(通常は1:1)
- 各メジャーバージョンのために
capacitor.config.tsに**defaultChannelを設定** - バージョン境界で自動ブロックが必要な場合はsemverルールを構成
--native-versionフラグを使用してバージョン固有のバンドルをアップロード- Capgoダッシュボードでバージョン配布を監視
高度なパターン
Section titled “高度なパターン”バージョン別の段階的ロールアウト
Section titled “バージョン別の段階的ロールアウト”// v1ユーザーをv2に段階的に移行async function migrateUsers() { const deviceId = await CapacitorUpdater.getDeviceId() const rolloutPercentage = 10 // 10%から開始
// デバイスIDをハッシュして確定的なパーセンテージを取得 const hash = hashCode(deviceId) % 100
if (hash < rolloutPercentage) { // ユーザーはロールアウトグループに属しています - v2に移行 await CapacitorUpdater.setChannel({ channel: 'v2' }) }}バージョン別フィーチャーフラグ
Section titled “バージョン別フィーチャーフラグ”// ネイティブバージョンに基づいて機能を有効化async function checkFeatureAvailability() { const info = await CapacitorUpdater.getDeviceId() const nativeVersion = info.nativeVersion
if (compareVersions(nativeVersion, '2.0.0') >= 0) { // v2.0.0+を必要とする機能を有効化 enableNewCameraFeature() }}バージョン間のA/Bテスト
Section titled “バージョン間のA/Bテスト”// 同じネイティブバージョン内でA/Bテストを実行async function assignABTest() { const nativeVersion = await getNativeVersion()
if (nativeVersion.startsWith('2.')) { // v2ユーザーのみでA/Bテスト const variant = Math.random() < 0.5 ? 'v2-test-a' : 'v2-test-b' await CapacitorUpdater.setChannel({ channel: variant }) }}Capgoは、バージョン固有のアップデート配信のための複数の戦略を提供します:
- チャネルベースのルーティング:
defaultChannel経由の自動バージョン分離 - セマンティックバージョニング: major/minor/patch境界を超えるアップデートを防止
- ネイティブバージョン制約: バンドルにミニバージョンを要求
- 自動ダウングレード防止: 古いバンドルを新しいネイティブバージョンに配信しない
- デバイスオーバーライド: テストとターゲティングのための手動制御
これらの戦略を組み合わせることで、AppFlowスタイルの自動アップデート配信をさらに多くの柔軟性と制御で実現できます。アプリのバージョニングとデプロイメントワークフローに最適なアプローチを選択してください。
特定の機能の詳細については: