跳过内容

版本目标

本指南解释了如何自动将最新兼容的捆绑包传递给基于本机应用程序版本的用户, 与 Ionic AppFlow 的方法类似这确保了简化的更新管理和更快的发布,同时防止了兼容性问题。

Capgo的版本目标系统允许您:

  • 自动向用户提供兼容的更新 根据用户的本机应用程序版本
  • 防止不兼容的更改 到不兼容的应用程序版本
  • 同时管理多个应用程序版本 无需复杂逻辑
  • 无缝地向特定用户组 发布更新

为 AppFlow 用户而言,版本目标至关重要(尤其是 AppFlow 用户)

标题:为 AppFlow 用户而言,版本目标至关重要(尤其是 AppFlow 用户)

如果您熟悉 "Ionic AppFlow",您就知道确保用户只接收兼容更新是多么重要。 AppFlow 自动将实时更新包匹配到原生应用程序版本,防止向较旧的原生 __CAPGO_KEEP_0__ 发送不兼容的 JavaScript。 __CAPGO_KEEP_0__ 提供相同的安全保证,, you know how critical it is to ensure users receive only compatible updates. AppFlow automatically matched live update bundles to native app versions, preventing incompatible JavaScript from being delivered to older native code.

Capgo provides the same safety guarantees多种策略(通道、语义版本、原生约束)

  • 更好的版本分布可见性
  • __CAPGO_KEEP_0__ 和 __CAPGO_KEEP_1__ 控制与仪表板管理
  • 这种方法在以下情况下尤其有用:
  • API and CLI control alongside dashboard management

当您需要更细粒度的版本匹配控制时

  • 您有不同版本的应用程序的用户(例如,v1.x,v2.x,v3.x)
  • 您需要在推出破坏性更改时保持向后兼容性
  • 您希望防止新版本的捆绑包破坏旧版本的code
  • 您正在逐渐从一个版本迁移到另一个版本
  • 您正在从 AppFlow 迁移 并且希望保持相同的更新安全性

Capgo 使用多层级的方法来匹配用户与兼容的更新:

  1. 本机版本约束:防止向不兼容的本机版本分发捆绑包
  2. 通道路由: 根据不同应用版本分配不同的更新频道
  3. 语义版本控制: 在主要/次要/修订版本边界处自动阻止更新
  4. 设备级别覆盖: targeting特定设备或用户组

版本匹配流程

标题:版本匹配流程
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:基于频道的版本路由

标题:基于频道的版本路由

这是 推荐方法 用于管理重大变更和主要版本更新。它与 AppFlow 的交付模型类似。

  • App v1.x (100,000 名用户) → production 频道
  • App v2.x (50,000 名用户带有重大变更) → v2 频道
  • App v3.x (10,000 名 beta 用户) → v3 频道

实施

实施

步骤 1:为每个主要版本配置通道

步骤 1:为每个主要版本配置通道
// capacitor.config.ts for version 1.x builds
import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.example.app',
appName: 'Example App',
plugins: {
CapacitorUpdater: {
autoUpdate: true,
defaultChannel: 'production', // or omit for default
}
}
};
export default config;
// capacitor.config.ts for version 2.x builds
const config: CapacitorConfig = {
appId: 'com.example.app',
appName: 'Example App',
plugins: {
CapacitorUpdater: {
autoUpdate: true,
defaultChannel: 'v2', // Routes v2 users automatically
}
}
};
// capacitor.config.ts for version 3.x builds
const config: CapacitorConfig = {
appId: 'com.example.app',
appName: 'Example App',
plugins: {
CapacitorUpdater: {
autoUpdate: true,
defaultChannel: 'v3', // Routes v3 users automatically
}
}
};

步骤 2:创建通道

终端窗口
复制到剪贴板
# Create channels for each major version
npx @capgo/cli channel create production
npx @capgo/cli channel create v2
npx @capgo/cli channel create v3
# Enable self-assignment so apps can switch channels
npx @capgo/cli channel set production --self-assign
npx @capgo/cli channel set v2 --self-assign
npx @capgo/cli channel set v3 --self-assign
终端窗口
# For v1.x users (from v1-maintenance branch)
git checkout v1-maintenance
npm run build
npx @capgo/cli bundle upload --channel production
# For v2.x users (from v2-maintenance or main branch)
git checkout main
npm run build
npx @capgo/cli bundle upload --channel v2
# For v3.x users (from beta/v3 branch)
git checkout beta
npm run build
npx @capgo/cli bundle upload --channel v3
  • 零 code 变更 - 通道路由自动发生
  • 清晰的分离 - 每个版本都有自己的更新管道
  • 灵活的目标 - 将更新推送到特定版本组
  • 安全的滚动 - 不兼容版本的破坏性更改永远不会到达

Use Capgo’s built-in semantic versioning controls to prevent updates across version boundaries.

终端窗口

复制到剪贴板
Section titled “Disable Auto-Update Across Major Versions”
# Create a channel that blocks major version updates
npx @capgo/cli channel create stable --disable-auto-update major

本配置意味着:

  • 应用程序版本的用户 1.2.3 将接收更新至 1.9.9
  • 用户将 不会 接收版本 2.0.0 自动
  • Prevents breaking changes from reaching older native code
终端窗口
# Block minor version updates (1.2.x won't get 1.3.0)
npx @capgo/cli channel set stable --disable-auto-update minor
# Block patch updates (1.2.3 won't get 1.2.4)
npx @capgo/cli channel set stable --disable-auto-update patch
# Allow all updates
npx @capgo/cli channel set stable --disable-auto-update none

策略 3:本机版本约束

标题:策略 3:本机版本约束

为防止向不兼容设备分发,请为捆绑包指定最低本机版本要求。

使用本机版本延迟条件

标题:使用本机版本延迟条件

当上传捆绑包时,您可以指定最低本机版本:

终端窗口
# This bundle requires native version 2.0.0 or higher
npx @capgo/cli bundle upload \
--channel production \
--native-version "2.0.0"

使用场景

使用场景
  1. 需要新本机插件

    终端窗口
    # Bundle needs Camera plugin added in v2.0.0
    npx @capgo/cli bundle upload --native-version "2.0.0"
  2. 本机 API 变更

    终端窗口
    # Bundle uses new Capacitor 6 APIs
    npx @capgo/cli bundle upload --native-version "3.0.0"
  3. 渐进式迁移

    终端窗口
    # Test bundle only on latest native version
    npx @capgo/cli bundle upload \
    --channel beta \
    --native-version "2.5.0"

策略 4:自动降级防护

标题:策略 4:自动降级防护

防止用户接收比当前本地版本更旧的捆绑包。

在频道设置中启用

标题:在频道设置中启用

在Capgo控制台中:

  1. 前往 频道 → 选择您的频道
  2. 在频道设置中启用 “在原生下禁用自动降级”
  3. 保存更改

或通过 CLI:

终端窗口
npx @capgo/cli channel set production --disable-downgrade
  • 用户设备:原生版本 1.2.5
  • 渠道包:版本 1.2.3
  • 结果: 更新被阻止(将会降级)

这在以下情况下很有用:

  • 用户手动从应用商店安装了更新版本
  • 您需要确保用户始终拥有最新的安全补丁
  • 您想防止回归错误

策略 5:设备级别目标

标题:策略 5:设备级别目标

为特定设备或用户组覆盖渠道分配

强制特定版本进行测试

标题:强制特定版本进行测试
import { CapacitorUpdater } from '@capgo/capacitor-updater'
// Force beta testers to use v3 channel
async function assignBetaTesters() {
const deviceId = await CapacitorUpdater.getDeviceId()
// Check if user is beta tester
if (isBetaTester(userId)) {
await CapacitorUpdater.setChannel({ channel: 'v3' })
}
}

设备控制台覆盖

标题:设备控制台覆盖

在 Capgo 控制台中:

  1. 前往 设备 → 查找设备
  2. 点击 设置频道设置版本
  3. 使用特定的频道或捆绑版本覆盖
  4. 设备将从覆盖源接收更新

完整的AppFlow样式工作流

标题:完整的AppFlow样式工作流

以下是一个结合所有策略的完整示例:

1. 初始设置 (App v1.0.0)

标题:1. 初始设置 (App v1.0.0)
终端窗口
# Create production channel with semver controls
npx @capgo/cli channel create production \
--disable-auto-update major \
--disable-downgrade
capacitor.config.ts
const config: CapacitorConfig = {
plugins: {
CapacitorUpdater: {
autoUpdate: true,
defaultChannel: 'production',
}
}
};

2. 发布破坏性更改 (App v2.0.0)

标题:2. 发布破坏性更改 (App v2.0.0)
终端窗口
# Create v2 channel for new version
npx @capgo/cli channel create v2 \
--disable-auto-update major \
--disable-downgrade \
--self-assign
# Create git branch for v1 maintenance
git checkout -b v1-maintenance
git push origin v1-maintenance
// capacitor.config.ts for v2.0.0
const config: CapacitorConfig = {
plugins: {
CapacitorUpdater: {
autoUpdate: true,
defaultChannel: 'v2', // New users get v2 channel
}
}
};

3. 将更新推送到两个版本

标题:3. 将更新推送到两个版本
终端窗口
# Update v1.x users (bug fix)
git checkout v1-maintenance
# Make changes
npx @capgo/cli bundle upload \
--channel production \
--native-version "1.0.0"
# Update v2.x users (new feature)
git checkout main
# Make changes
npx @capgo/cli bundle upload \
--channel v2 \
--native-version "2.0.0"

4. 监控版本分布

标题:4. 监控版本分布

使用 Capgo 面板来跟踪:

  • v1 和 v2 用户数量
  • 每个版本的捆绑包采用率
  • 每个版本的错误或崩溃次数

5. 废弃旧版本

标题:5. 废弃旧版本

当 v1 使用量低于阈值时:

终端窗口
# Stop uploading to production channel
# Optional: Delete v1 maintenance branch
git branch -d v1-maintenance
# Move all remaining users to default
# (They'll need to update via app store)

当存在多个渠道配置时,Capgo 使用以下顺序:

  1. 设备覆盖 (控制台或API) - 优先级最高
  2. Cloud 覆盖 通过 setChannel() 呼叫
  3. 默认频道 在 capacitor.config.ts 中
  4. 默认频道 (Cloud 设置) - 优先级最低

最佳实践

最佳实践
// ✅ 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 manually
终端窗口
# ✅ Good
1.0.0 1.0.1 1.1.0 2.0.0
# ❌ Bad
1.0 1.1 2 2.5
终端窗口
# ✅ Good: Separate branches per major version
main (v3.x)
v2-maintenance (v2.x)
v1-maintenance (v1.x)
# ❌ Bad: Single branch for all versions

4. 在发布前进行测试

标题:4. 在发布前进行测试
终端窗口
# Test on beta channel first
npx @capgo/cli bundle upload --channel beta
# Monitor for issues, then promote to production
npx @capgo/cli bundle upload --channel production

5. 监控版本分布

标题:5. 监控版本分布

定期检查您的仪表板:

  • 用户是否正在升级到新版本的原生版本?
  • 老版本是否仍然获得高流量?
  • 是否应该弃用老版本的渠道?

与Ionic AppFlow的比较

标题:与Ionic AppFlow的比较

对于从 Ionic AppFlow, here’s how Capgo’s version targeting compares:

Capgo的团队来说,Capgo
的版本目标化功能与Ionic AppFlow相比: defaultChannel 功能
Ionic AppFlowCapgo高级版 --disable-auto-update (主/次/修订)
原生版本约束在 AppFlow 控制台中进行手动配置内置 --native-version 在 CLI 中的标志
频道管理Web UI + CLIWeb UI + CLI + API
设备覆盖有限的设备级控制通过控制台/ API 进行完全控制
防止自动降级通过 --disable-downgrade
多版本维护手动分支/频道管理自动优先使用频道
自主托管是 (完全控制)
版本分析基本详细每个版本指标

故障排除

故障排除

用户未接收更新

用户未接收更新

检查以下内容:

  1. 频道分配: 确保设备位于正确的频道

    const channel = await CapacitorUpdater.getChannel()
    console.log('Current channel:', channel)
  2. 版本约束: 检查是否有本地版本要求

    • 仪表板 → 包 → 检查“本地版本”列
  3. Semver 设置: 验证渠道的 disable-auto-update 设置

    终端窗口
    npx @capgo/cli channel list
  4. 设备覆盖: 检查设备是否有手动覆盖

    • 仪表板 → 设备 → 搜索设备 → 检查渠道/版本

版本包传递到错误的版本

版本包传递到错误的版本
  1. Review defaultChannel: 确保正确的渠道 capacitor.config.ts
  2. Check Bundle Upload: 验证版本包上传到预期的渠道
  3. Inspect Native Version: 确认标志使用正确 --native-version 影响旧版本的重大变化

影响旧版本的重大变化

Immediate Fix
  1. 立即修复Override 受影响的设备到安全捆绑
    • 仪表盘 → 设备 → 批量选择 → 设置版本
  2. 长期修复创建版本化通道并维护单独分支
  3. 预防在滚动部署之前始终在代表性设备上测试更新

从 Ionic AppFlow 迁移

标题:从 Ionic AppFlow 迁移

如果您从 Ionic AppFlow,版本目标在 Capgo 中与 Ionic AppFlow 类似,但具有改进的灵活性:

概念映射

概念映射
AppFlow概念Capgo 等效备注
部署频道Capgo 频道相同概念,更加强大
原生版本锁定--native-version 标志更细致的控制
频道优先级频道顺序(override → 云 → 默认)更透明的先行
部署目标通道 + semver 控制可用的多种策略
生产通道production 通道 (或任意名称)灵活的命名
基于 Git 的部署CLI 从分支上传捆绑相同的工作流程
自动版本匹配defaultChannel + 版本约束增强了多种策略

AppFlow 用户的关键区别

标题:AppFlow 用户的关键区别
  1. 更大的控制权: Capgo 给您多种策略(通道、语义版本、原生版本)可组合
  2. 更好的可见性: 版本分布和兼容性问题的仪表板
  3. API 访问: 对版本目标有完全的程序化控制
  4. 自主托管: 运行自己的更新服务器,具有相同的版本逻辑

迁移步骤

迁移步骤
  1. 映射 AppFlow 通道 到 Capgo 通道(通常 1:1)
  2. 设置 defaultChannelcapacitor.config.ts 每个主要版本
  3. 配置 semver 规则 如果您想在版本边界处自动阻止
  4. 上传版本特定包 使用 --native-version 旗帜
  5. 监控版本分布 在 Capgo 控制台

逐步版本发布

标题:逐步版本发布
// Gradually migrate v1 users to v2
async 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' })
}
}

版本特性标志

标题:版本特性标志
// Enable features based on native version
async 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 version
async 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 提供多种针对版本的更新分发策略:

  1. 基于频道的路由:通过 defaultChannel
  2. 语义版本号:防止更新跨越主/次/修订版本
  3. 原生版本约束: 最低版本要求
  4. 自动降级防止: 不向新版原生版本发送旧版本
  5. 设备覆盖: 用于测试和目标的手动控制

通过组合这些策略,您可以实现AppFlow样式的自动更新分发,具有更大的灵活性和控制。选择最适合您的应用版本和部署工作流的方法。

有关具体功能的更多详细信息: