你是否曾经希望能够直接将更改发送给特定用户,让他们立即进行审阅和反馈 - 而无需要求他们下载并安装来自TestFlight或Google Play的新版本?
我曾经有客户要求我进行改进,我能够快速实施,但将结果传递给他们进行验证意味着需要将更新发送给所有用户(风险性)或创建一个专门为客户的单独版本(对我们双方来说是一项繁琐的工作)。
开发者想要能够为不同用户组提供不同的更新,例如非技术人员、QA或整个用户群(在适当时)。
生产版本无法切换到工作版本,收集反馈,然后返回生产版本。
That’s what 频道切换 使得
成为可能。 一款安装在用户设备上的应用程序可以在运行时切换更新频道,从而将生产应用程序转变为一个灵活的空间来进行审阅和迭代,而不是一个固定的终点。 这对于非技术人员来说尤其有用,他们可以在他们已经安装的应用程序中测试更改并直接提供反馈。
Update channels are how Capgo targets updates to specific builds. Each build is associated with a channel, and that channel determines which updates it will receive.
更新频道是__CAPGO_KEEP_0__如何针对特定构建进行更新的方式。 每个构建都与一个频道相关联,而该频道决定它将接收哪些更新。 preview 例如,您可以在 production频道发布更新,而不影响
Channels in Capgo allow you to:
- __CAPGO_KEEP_0__中的频道允许您:
- 针对不同功能的特定用户组
- 通过将用户分配到不同的频道来运行A/B测试
- 创建测试版程序
- 使用单个用户进行生产问题调试
如果您不熟悉更新频道, Capgo 更新频道文档 涵盖了它们的更多细节。
什么是频道浏览?
频道浏览允许安装的应用程序从不同的更新流中拉取内容,而无需重新安装。安装的应用程序可以在运行时切换更新频道,并且它将继续从新选择的频道接收更新,直到应用程序被卸载或切换到另一个频道。
在实践中,这意味着产品负责人或QA可以切换一个 production 例如, preview 频道,尝试最新的更改。当他们完成测试时,他们切换回 production 没有重新安装或单独的预览构建的需要。
在背后,频道浏览通过让应用程序告诉更新客户端使用哪个频道来工作。这个选择可以在运行时更改,并且直到它被清除或替换为止会持续有效。
How to Implement Channel Surfing
在开始尝试频道切换之前,您的项目需要配置 Capgo Live Updates。要设置此项,请遵循 Capgo 快速入门指南.
仅需在您要切换到的频道中启用“允许设备自行关联”选项即可,在 Capgo 控制台中进行此设置。 此外,不需要进行任何 code 配置修改。
频道切换的核心是由一个 API 调用驱动的:
import { CapacitorUpdater } from '@capgo/capacitor-updater';
await CapacitorUpdater.setChannel({ channel: 'your-channel' });
此设置确定在查询 Capgo 更新时使用的频道。 了解更多关于 setChannel API.
即刻频道切换(v5.34.0+)
从插件版本 5.34.0、6.34.0、7.34.0 或 8.0.0 开始(取决于您的主版本) 频道切换的方式会有所不同,速度也会更快: setChannel() __CAPGO_KEEP_0__ quickstart guide
- 后端验证 (只读): 向 Capgo 后端发送请求,验证是否允许切换频道
- 本地存储更新: 验证通过后,频道会被保存到设备的本地存储
- 即刻生效: 下一次更新检查会立即使用新的频道
之前, setChannel() 频道的覆盖设置会保存到后端数据库(如控制台或 API 变更)。设备需要等待后端复制(最多 2 分钟)才能识别新的频道。新行为只从后端读取(验证)并存储本地,频道切换立即生效。
完整的频道切换流程
为了提供更好的用户体验,您通常会希望做更多的事情,仅仅切换频道并等待下一次应用重启。一个常见的方法是立即检查更新,下载可用更新并重新加载应用,使用户直接进入所选频道的更新。
典型的流程如下:
- 切换频道(
setChannel) - 检查更新(
getLatest) - 获取并应用更新(
download,set或next) - 在Capacitor中,
reload)
重新加载应用程序(
import { CapacitorUpdater } from '@capgo/capacitor-updater';
async function switchChannel(selectedChannel: string) {
try {
// 1. Set the updates channel (with optional auto-update trigger)
await CapacitorUpdater.setChannel({
channel: selectedChannel,
triggerAutoUpdate: true // Immediately check for updates
});
console.log(`Switched to channel: ${selectedChannel}`);
// If you want more control, handle the update manually:
// const latest = await CapacitorUpdater.getLatest();
// if (latest.url) {
// const bundle = await CapacitorUpdater.download({
// url: latest.url,
// version: latest.version
// });
// await CapacitorUpdater.set({ id: bundle.id });
// }
} catch (error) {
console.error('Failed to switch channel:', error);
}
}
// Switch to the beta channel
switchChannel('beta');
以下是完整示例:
您可以按照自己喜欢的方式结构此流程。您可能会将这些步骤分散在多个交互中,或者一次性运行它们。无论您如何结构流程,都要确保考虑到失败。网络问题或无效的频道都可能阻止更新被应用。
唯一的要求:启用自我赋值 这是启用频道切换所需的唯一事情。 setChannel(), you must enable self-assignment for that channel in the Capgo dashboard:
- 之前,您必须在__CAPGO_KEEP_0__控制台中为该频道启用自我赋值: 前往频道管理页面:频道( 在您的Capgo控制台中
- 点击您要管理的频道名称
- 启用 “允许设备自行关联”
- 保存更改

就这样。无需在您的应用程序中进行任何配置更改。无需设置。只需在您希望用户可以切换到的频道上启用自我分配即可。 defaultChannel 如果此设置被禁用,任何尝试使用此频道的调用都会失败,并且将触发事件。
列出可用频道 setChannel() __CAPGO_KEEP_0__ channelPrivate __CAPGO_KEEP_0__
__CAPGO_KEEP_0__
您可以获取可供自行分配的频道列表:
const { channels } = await CapacitorUpdater.listChannels();
console.log('Available channels:', channels.map(c => c.name));
// Use this to build a channel selector UI
这只会返回自分配功能已启用的频道。
获取当前频道
检查设备当前分配的频道:
const { channel } = await CapacitorUpdater.getChannel();
console.log('Current channel:', channel);
恢复默认频道
要移除频道覆盖并返回到默认,请
await CapacitorUpdater.unsetChannel({});
这会将设备从任何特定分配的频道中解除绑定,导致其回落到 defaultChannel 在您的配置或云端默认中。
如何测试频道冲浪
要看到频道冲浪的效果,您需要一个发布版本 - @capgo/capacitor-updater API 是为发布版本设计的。 在调试版本中,应用通常从开发服务器加载 JavaScript,而不是正常的更新流程。
前置条件
仅需启用每个允许切换的频道 “允许设备自行关联” 在每个允许切换的频道上启用此选项即可,无需在您的应用中进行任何配置更改。
创建测试构建
按照正常流程构建您的应用:
bun run build && npx cap sync
然后使用 Xcode 或 Android Studio 创建本机构建,或者使用您的 CI/CD pipeline。应用将以您的 Capgo 控制台中设置的云默认频道启动。
发布到不同频道的更新
一旦应用安装完成,发布到不同频道的更新:
# Publish to preview channel
npx @capgo/cli@latest bundle upload --channel preview
# Publish to production channel
npx @capgo/cli@latest bundle upload --channel production
然后在应用中导航到频道切换 UI 并触发频道切换。应用应从所选频道获取更新并重新加载到新更新。
构建频道切换器 UI
频道切换通常是您希望限制到特定用户组,而不是向所有使用您的应用的用户开放。例如,您可能只允许已认证的员工通过按钮切换到预览频道。
以下是 React 组件的示例,用于频道切换器:
import { useState, useEffect } from 'react';
import { CapacitorUpdater } from '@capgo/capacitor-updater';
export function ChannelSwitcher() {
const [currentChannel, setCurrentChannel] = useState<string>('');
const [availableChannels, setAvailableChannels] = useState<string[]>([]);
const [isLoading, setIsLoading] = useState(false);
useEffect(() => {
loadChannelInfo();
}, []);
async function loadChannelInfo() {
const { channel } = await CapacitorUpdater.getChannel();
setCurrentChannel(channel || 'default');
const { channels } = await CapacitorUpdater.listChannels();
setAvailableChannels(channels.map(c => c.name));
}
async function handleChannelSwitch(channel: string) {
setIsLoading(true);
try {
await CapacitorUpdater.setChannel({
channel,
triggerAutoUpdate: true
});
setCurrentChannel(channel);
// App will update in background or on next restart
} catch (error) {
console.error('Failed to switch channel:', error);
} finally {
setIsLoading(false);
}
}
return (
<div>
<p>Current channel: {currentChannel}</p>
<div>
{availableChannels.map(channel => (
<button
key={channel}
onClick={() => handleChannelSwitch(channel)}
disabled={isLoading || channel === currentChannel}
>
Switch to {channel}
</button>
))}
</div>
</div>
);
}
OTA更新注意事项
这些并不是与频道切换相关的,但在切换频道时会迅速变得显著。
运行时版本不匹配
在Capgo中,更新与原生应用版本绑定。如果更新的原生版本与安装的原生版本不匹配,更新就不会被下载或应用。当频道切换时,这通常表现为应用切换频道,但没有更新被应用,即使在该频道上有更新。
这通常意味着更新是从应用的不同原生版本发布的。确保频道的包与设备上安装的原生版本兼容。
移除或撤销更新
如果应用已经下载了某个频道的更新,删除该更新从Capgo控制台中不一定会从设备上移除。删除只会停止 未来的 下载。
撤销不良更新的最可靠方法是发布一个已知的良好更新到同一个频道。这会在频道的历史记录中创建一个新的更新,客户端会将其视为最新版本并应用。
Capgo还提供了回滚机制,可以指示客户端重新应用之前的稳定更新或回退到构建中嵌入的更新。
数据迁移考虑因素
切换频道会改变应用程序运行的 JavaScript 包。如果您的应用程序依赖于迁移或数据形状,且这些迁移或数据形状在不同频道之间不兼容,频繁切换可能会导致问题。
例如,如果 beta 更新应用了数据库迁移,生产版本可能无法理解新的 schema。开发人员应确保更新在切换频道时保持安全,或者在需要时限制切换到一方向。
Why Channel Surfing Improves Mobile Iteration
频道切换在生产环境中快速查看变化时尤其有用。
快速验证
想象一下,需要在广泛发布之前验证紧急修复。通过频道切换,修复可以被隔离到一小组指定用户中,他们可以在发布之前验证修复。
利益相关者审查
产品负责人或 QA 可以切换到另一个更新频道的已安装生产构建,验证修复或功能,然后切换回原频道。
流程化测试
这使得非技术利益相关者能够参与审查和决策,同时保持流程顺畅。一个生产构建变成了一个灵活的工具,用于测试、反馈和验证。
用例
- QA 测试: QA团队可以在不同功能分支之间切换
- Beta Programs: 用户可以选择参与早期访问的beta频道
- Stakeholder Review: 产品负责人在发布前预览更改
- A/B Testing: 将用户分配到不同频道进行实验
- Debugging: 将特定用户切换到调试频道以诊断问题
Comparison: Channel Change Methods
| Method | Effect Time | 持久存储在哪里 | 使用场景 |
|---|---|---|---|
setChannel() 从插件 |
即刻 | 仅设备(本地) | 用户在应用内切换频道 |
| 设备控制台设备强制切换 | 至多2分钟 | 后端数据库 | 管理员针对特定设备的更改 |
| API频道分配 | 至多2分钟 | 后端数据库 | 自动化后端集成 |
为了在构建频道切换UI时获得最佳用户体验,始终使用插件的 setChannel() 最佳实践
限制访问
- :频道浏览通常用于内部使用 - 不要将其暴露给所有用户处理错误
- :切换频道时始终优雅地处理错误验证兼容性
- :不同频道上的更新与安装的本机版本兼容文档频道
- __CAPGO_KEEP_0__ : 保持每个频道的清晰文档
- Monitor Usage : 跟踪设备在哪个频道上进行调试
Resources
Conclusion
频道切换变革了你如何迭代你的 Capacitor 应用。相比于将生产构建视为固定的端点,它们变成了灵活的工具,用于测试、验证和快速迭代。
随着最近插件版本中引入的即时频道切换功能,体验现在变得无缝 - 用户可以切换频道并立即从新频道接收更新,而无需等待任何时间。
无论你是在与利益相关者验证bug修复、运行beta程序还是调试特定用户的问题,频道切换都给你了灵活性,能够将正确的更新发送给正确的用户在正确的时间。
继续阅读Capgo:如何在运行时切换更新频道
如果您正在使用 Channel Surfing for Capgo: How to Switch Update Channels at Runtime Channel Surfing for __CAPGO_KEEP_0__: How to Switch Update Channels at Runtime Channel Surfing for __CAPGO_KEEP_0__: How to Switch Update Channels at Runtime Channel Surfing for __CAPGO_KEEP_0__: How to Switch Update Channels at Runtime Channel Surfing for __CAPGO_KEEP_0__: How to Switch Update Channels at Runtime Channel Surfing for __CAPGO_KEEP_0__: How to Switch Update Channels at Runtime Channel Surfing for __CAPGO_KEEP_0__: How to Switch Update Channels at Runtime Channel Surfing for __CAPGO_KEEP_0__: How to Switch Update Channels at Runtime Channel Surfing for __CAPGO_KEEP_0__: How to Switch Update Channels at Runtime Channel Surfing for __CAPGO_KEEP_0__: How to Switch Update Channels at Runtime 版本目标解决方案 为版本目标解决方案中的产品工作流