Native + OTA 工作流
开发/生产渠道,何时保留 --fail-on-incompatible,以及如何发布有意为之的原生基线。
复制包含安装步骤和该插件完整 Markdown 指南的配置 prompt。
Capgo live update 会替换您应用的 JavaScript bundle ,但无法更改 原生 应用的一部分——Capacitor/Cordova 插件、原生依赖项以及编译到已安装二进制文件中的原生项目配置。当新 bundle 需要已安装二进制文件中没有的原生 code 时,该 bundle 将 与原生不兼容: Capgo 仍可推送该更新,但在仍运行旧版 Native Build 的设备上可能会崩溃或运行异常。
本页说明 Capgo 如何检测原生兼容性、不兼容更新对用户意味着什么,以及如何安全地发布原生变更。
Capgo 可以从你生成的 web build 文件夹发送文件。如果变更只影响 HTML、CSS、JavaScript、资源文件,或打包进该输出的纯 JavaScript 包,就把它作为 live update 发布。
当变更会更新以下内容时,请使用原生应用发布: capacitor.config.ts插件配置(存储在 Capacitor 配置中)、原生插件或依赖项、Capacitor 本身,或 iOS/Android 项目文件。一个实用的判断方法:如果变更必须通过以下方式更新原生项目 npx cap sync 或 npx cap copy 在已安装设备上可用之前,请将其视为原生代码。
| 变更 | 使用 Capgo OTA 发布? | 原因 |
|---|---|---|
| HTML、CSS、应用 JavaScript、图片、字体及其他 Web 构建资源 | 是 | 它们在运行时从 Web bundle 加载。 |
| 打包到 Web 输出中的纯 JavaScript 包变更 | 是 | 生成的 JavaScript 是 Web bundle 的一部分。 |
capacitor.config.ts 变更 | 否 | 在构建时,Capacitor 配置会被读取到原生应用中。 |
| 添加、移除或升级 Capacitor/Cordova 插件 | 否 | 已安装的原生二进制文件必须包含匹配的原生 code。 |
| iOS 或 Android 项目文件变更 | 否 | 现有用户需要从应用商店获取新的二进制文件。 |
Capgo 为每种混合运行时提供专用的更新器客户端:
| 插件 | 适用场景 |
|---|---|
@capgo/capacitor-updater | Capacitor iOS/Android 应用 |
@capgo/cordova-updater | Cordova iOS 7+ / Android 13+ 应用 |
@capgo/electron-updater | Electron 桌面应用 |
无论使用哪个客户端插件,都会执行原生兼容性检查——它会比对 bundle 中记录的原生依赖与已安装的二进制文件。
每个 Capacitor 应用都包含两层:
live update 仅替换 JavaScript 层。如果新的 JavaScript 调用了未编译进已安装的二进制文件的原生插件或 API,调用会在运行时失败——这可能导致应用崩溃或功能静默失效。简单来说:Capgo 无法更新原生 code,因此运行旧版 Native Build 的设备无法安全运行针对新版原生 code 构建的 bundle。
当您上传 bundle 或手动运行检查时,Capgo 会将 原生包 (您本地项目中的 Capacitor/Cordova 插件及其版本)与为该 bundle 记录的原生包进行对比,该 bundle 当前在 Channel 上生效:
bunx @capgo/cli@latest bundle compatibility com.example.app --channel productionCLI 会打印一张表,列出每个原生包的本地版本、channel 上当前生效的版本以及状态:
Package Local Remote Status@capacitor/core 6.1.2 6.1.2 ✅@capacitor/share 6.0.0 6.0.0 ✅@capacitor/camera 6.1.0 — ❌ not in the live bundle对于 pipeline, bundle releaseType 将检查简化为一个单词:
bunx @capgo/cli@latest bundle releaseType com.example.app --channel production# → OTA safe to ship as a live update# → native needs a new app-store build将此作为发布 pipeline 的门槛:当它输出 live update 时, OTA,当它输出 native.
在仍运行 旧版原生 binary 的设备上,缺失的原生 code 可能导致崩溃或功能异常 —— 即使更新已“成功”下载并应用。这就是为什么 live update 可能已经上线并下发,却仍会让现有用户的应用出问题,以及为什么 Capgo 能在不兼容的 bundle 上线时向你发出警告。
Capgo 的 自动回滚 可以捕获在 notifyAppReady() 之前抛出的 JavaScript 错误,但它不能替代发布兼容的原生 code —— 稍后导致崩溃或原生崩溃的不匹配可能会绕过它。
当 bundle 需要新的原生 code 时,请构建并向 App Store / Play Store 提交新的二进制文件(或使用 Capgo Cloud Build 重新构建)。一旦用户更新了二进制文件,bundle 的原生依赖项就会匹配,live update 也能正常运行。
如果某个 channel 上已激活不兼容的 bundle,请将该 channel 回滚到最后一个兼容的 build,以停止分发,直到新的 native build 发布。参见 回滚.
两个互补的保护机制,它们都会实际检查你的 native 包:
在 CI 中使上传失败 — --fail-on-incompatible
在你的 bundle upload 步骤中添加该标志。如果 bundle 的 native 包与 channel 当前在线版本不匹配,上传将 以非零退出码失败,且不会发布任何内容 —— 这样你的 pipeline 就能阻止你静默发布一个在用户安装 native build 之前无法生效的 OTA 更新:
bunx @capgo/cli@latest bundle upload --channel production --fail-on-incompatible兼容的上传——以及无法执行检查的情况(新渠道或无远程元数据)——将原样通过。在交互式终端中,它会提供 Capgo Builder 原生构建流程;拒绝则失败。(不能与 --ignore-metadata-check.)
按原生版本控制交付—— metadata + --auto-min-update-version
当你 执行 同时发布 Native Build 和 bundle,将 channel 设置为 metadata 策略,并使用 --auto-min-update-versionCapgo 会在每次上传时执行兼容性检查;当 bundle 需要新的原生 code 时,它会提高更新下限,这样尚未安装匹配原生 build 的设备就不会收到该更新:
# one-time: switch the channel to the metadata strategybunx @capgo/cli@latest channel set production com.example.app --disable-auto-update metadata
# from then on, Capgo sets the floor automatically on every uploadbunx @capgo/cli@latest bundle upload --channel production --auto-min-update-version查看 版本定向 以获取完整的定向选项。
Native + OTA 工作流
开发/生产渠道,何时保留 --fail-on-incompatible,以及如何发布有意为之的原生基线。
自动 OTA 或原生
集成 bundle releaseType 到 GitHub Actions 或 GitLab,以便 CI 选择 live update 或 Capgo Build。
版本定向
通过渠道、semver 规则和元数据策略,仅分发兼容的 bundle。
回滚
如果上线了不兼容的 bundle,可将 channel 回滚到上一个兼容的 build。
更新类型
应用时机、延迟条件和版本拦截如何协同工作。
CLI:bundle
关于 bundle 兼容性、releaseType 和上传选项的参考。
如果你正在使用 原生兼容性 为确保 Live Update 安全,请将其与 版本定向 以根据原生版本路由 bundle, 回滚 以在发布不兼容 bundle 时进行恢复, 更新类型 以了解 channel 版本阻塞机制,以及 Capgo CLI bundle 引用 用于 compatibility 和 releaseType 命令。