跳转到正文

原生兼容性

Capgo live update 会替换您应用的 JavaScript bundle ,但无法更改 原生 应用的一部分——Capacitor/Cordova 插件、原生依赖项以及编译到已安装二进制文件中的原生项目配置。当新 bundle 需要已安装二进制文件中没有的原生 code 时,该 bundle 将 与原生不兼容: Capgo 仍可推送该更新,但在仍运行旧版 Native Build 的设备上可能会崩溃或运行异常。

本页说明 Capgo 如何检测原生兼容性、不兼容更新对用户意味着什么,以及如何安全地发布原生变更。

TLDR:OTA 还是 Native Build?

章节标题:“TLDR:OTA 还是原生?”

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-updaterCapacitor iOS/Android 应用
@capgo/cordova-updaterCordova iOS 7+ / Android 13+ 应用
@capgo/electron-updaterElectron 桌面应用

无论使用哪个客户端插件,都会执行原生兼容性检查——它会比对 bundle 中记录的原生依赖与已安装的二进制文件。

为什么 Native 兼容性至关重要

章节标题:“为什么原生兼容性很重要”

每个 Capacitor 应用都包含两层:

  • 本指南中介绍的 原生二进制文件 用户从 App Store / Play Store 安装。它包含 Capacitor、您的原生插件以及原生配置。
  • 本指南中介绍的 JavaScript 包 (您的 Web 应用),Capgo 可以对其进行热更新。

live update 仅替换 JavaScript 层。如果新的 JavaScript 调用了未编译进已安装的二进制文件的原生插件或 API,调用会在运行时失败——这可能导致应用崩溃或功能静默失效。简单来说:Capgo 无法更新原生 code,因此运行旧版 Native Build 的设备无法安全运行针对新版原生 code 构建的 bundle。

当您上传 bundle 或手动运行检查时,Capgo 会将 原生包 (您本地项目中的 Capacitor/Cordova 插件及其版本)与为该 bundle 记录的原生包进行对比,该 bundle 当前在 Channel 上生效:

  • 如果两者匹配,说明变更仅涉及 JavaScript, 可以安全地进行热更新.
  • 如果添加、删除了插件或更改了版本,则该 bundle 与原生不兼容 — 这些更改只有在用户安装新的原生二进制文件后才会生效。

通过 CLI 进行检查

标题为“从 CLI 检查”
终端窗口
bunx @capgo/cli@latest bundle compatibility com.example.app --channel production

CLI 会打印一张表,列出每个原生包的本地版本、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 —— 稍后导致崩溃或原生崩溃的不匹配可能会绕过它。

发布新的 Native Build(真正的修复)

标题为“发布新的原生构建(真正的修复)”的章节

当 bundle 需要新的原生 code 时,请构建并向 App Store / Play Store 提交新的二进制文件(或使用 Capgo Cloud Build 重新构建)。一旦用户更新了二进制文件,bundle 的原生依赖项就会匹配,live update 也能正常运行。

如果已上线不兼容的 Bundle,请回滚

标题为“回滚已上线的不兼容 bundle”的章节

如果某个 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 strategy
bunx @capgo/cli@latest channel set production com.example.app --disable-auto-update metadata
# from then on, Capgo sets the floor automatically on every upload
bunx @capgo/cli@latest bundle upload --channel production --auto-min-update-version

查看 版本定向 以获取完整的定向选项。

如果你正在使用 原生兼容性 为确保 Live Update 安全,请将其与 版本定向 以根据原生版本路由 bundle, 回滚 以在发布不兼容 bundle 时进行恢复, 更新类型 以了解 channel 版本阻塞机制,以及 Capgo CLI bundle 引用 用于 compatibility 和 releaseType 命令。