跳过内容

原生兼容性

一个Capgo实时更新将替换您的应用的 JavaScript包 立即生效,但无法改变 原生 part of your app — the Capacitor/Cordova plugins, native dependencies, and native project configuration that are compiled into the installed binary. When a new bundle expects native code that the installed binary doesn’t have, the bundle is 原生不兼容: Capgo仍然可以传递它,但在仍在运行旧版原生构建的设备上,它可能会崩溃或不正常工作。

This page explains how Capgo detects native compatibility, what an incompatible update means for your users, and how to ship native changes safely.

Capgo can send files from your generated web build folder. If the change only affects HTML, CSS, JavaScript, assets, or pure-JavaScript packages bundled into that output, ship it as a live update.

使用原生应用发布时,更新变更时 capacitor.config.ts插件配置存储在Capacitor配置中,原生插件或依赖项,Capacitor自身,或iOS/Android项目文件。实用检查:如果变更必须更新原生项目通过 npx cap syncnpx cap copy 在安装设备上使用它之前,视为原生。

变更与CapgoOTA一起发布?为什么
HTML、CSS、应用JavaScript、图像、字体和其他Web构建资产它们在运行时从Web包中加载。
纯JavaScript包更改打包到您的Web输出中The generated JavaScript is part of the web bundle.
capacitor.config.ts 更改NoCapacitor 配置在构建时间读入到原生应用中。
添加、删除或升级 Capacitor/Cordova 插件No安装的原生二进制文件必须包含匹配的原生 code。
iOS 或 Android 项目文件更改No现有用户需要从商店获取新的二进制文件。

客户端插件按栈排列

按栈排列的客户端插件

Capgo 为每个混合运行时提供专用更新客户端:

插件使用时
@capgo/capacitor-updaterCapacitor iOS/Android 应用
@capgo/cordova-updaterCordova iOS 7+ / Android 13+ 应用
@capgo/electron-updaterElectron 桌面应用

原生兼容性检查始终适用于客户端插件 — 它们将捆绑的原生依赖项与安装的二进制文件进行比较。

每个 Capacitor 应用都有两个层次:

  • 本机二进制 本机二进制 用户从 App Store / Play Store 安装。它包含 Capacitor,您的原生插件和原生配置。
  • The JavaScript 包 (您的 Web 应用) Capgo 可以通过无线电更新。

实时更新仅更换 JavaScript 层。如果该新 JavaScript 调用原生插件或 API,但未编译到已安装的二进制文件中,则在运行时会出现调用失败的情况 —— 这可能会导致应用程序崩溃或静默地破坏一个功能。简而言之: Capgo 无法更新原生 code,因此运行旧原生构建的设备无法安全地运行针对新原生 code 构建的包。

Capgo 如何检测兼容性

Capgo 如何检测兼容性

当您上传包或手动运行检查时,Capgo 将比较 本地项目中的原生包 (您的 Capacitor/Cordova 插件及其版本)与包 当前在渠道上记录的原生包:

  • 如果它们匹配,则更改仅为 JavaScript-only safe to ship over the air.
  • 如果一个插件被添加、删除或版本号改变, 不兼容原生 — 只有用户安装了新的原生二进制文件,这些变化才会生效。
终端窗口
bunx @capgo/cli@latest bundle compatibility com.example.app --channel production

CLI 打印出每个原生包的本地版本、该版本在渠道中的版本和状态:

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

获取机器可读的判决结果(CI)

标题为“获取机器可读的判决结果(CI)”

对于管道, 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

将发布管道门控在此:在它打印时发送一个实时更新, OTA并在它打印时触发一个原生构建, native.

对于用户来说,什么是不兼容的更新

不兼容更新的含义

在仍在运行的原生二进制文件的设备上,缺失的原生__CAPGO_KEEP_0__可能会导致程序崩溃或功能异常 — 即使更新下载并应用成功。这是为什么即使是实时更新可以实时发布并仍然会破坏现有用户的应用,以及为什么__CAPGO_KEEP_1__可以在不兼容的包发布时警告你的原因。 __CAPGO_KEEP_0__的, the missing native code can cause crashes or broken features — even though the update downloaded and applied “successfully.” This is why a live update can be live and delivered yet still break the app for existing users, and why Capgo can warn you when an incompatible bundle goes live.

可以捕获在Capgo运行之前抛出的JavaScript错误,但这并不是代替发布兼容的原生Capgo的方法 — 一旦出现原生崩溃或崩溃,后果就无法避免了。 安全地发布原生更新 安全地发布原生更新 notifyAppReady() runs, but it isn’t a substitute for shipping compatible native code — a mismatch that crashes later, or crashes natively, can slip past it.

安全地发布原生更新

安全地发布原生更新

When a bundle needs new native code, build and submit a new binary to the App Store / Play Store (or rebuild with Capgo Cloud Build). Once users update the binary, the bundle’s native dependencies line up and the live update runs correctly.

如果已经发布了不兼容的包,回滚到上一个兼容的版本

标题:如果已经发布了不兼容的包,回滚到上一个兼容的版本

如果某个频道上已经发布了不兼容的包,恢复到上一个兼容的版本,直到用户安装了本地包为止。请参阅 回滚.

防止不兼容的发布

标题:防止不兼容的发布

两个互补的守卫,实际上都检查了您的本地包:

CI 中的上传失败 — --fail-on-incompatible

将标志添加到您的 bundle upload 步骤。如果包的本地包不匹配频道的当前发布版本,上传 将以非零退出码失败,并且不会发布任何内容 — 因此您的管道会阻止您静默发布一个无法立即生效的 OTA 更新,直到用户安装了本地包:

Terminal 窗口
bunx @capgo/cli@latest bundle upload --channel production --fail-on-incompatible

兼容上传 — 和检查无法运行的情况(新频道或无远程元数据) — 将保持不变。 在交互式终端中,它提供了 Capgo Builder 原生构建流程;拒绝将导致失败。 (无法与 --ignore-metadata-check.)

Gate 原生版本的交付 — metadata + --auto-min-update-version

当您 将原生构建和捆绑包一起发送时,请将频道放在 策略上并上传 metadata 。 __CAPGO_KEEP_0__ 在每次上传时运行兼容性检查,并在捆绑包需要新的原生 __CAPGO_KEEP_1__ 时,升高更新阈值,以便尚未安装匹配原生构建的设备不会接收到它: --auto-min-update-version. Capgo runs the compatibility check on every upload and, when a bundle needs new native code, raises the update floor so devices that haven’t installed the matching native build don’t receive it:

复制到剪贴板
# 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

参见 版本目标 了解所有目标选项的详细信息。

如果您正在使用 原生兼容性 来安全地保持实时更新,连接它与 版本目标 来通过原生版本路由捆绑包, 回滚 来恢复当不兼容的捆绑包发布时, 更新类型 来了解通道版本阻塞,和 Capgo CLI捆绑包引用 用于兼容性和releaseType命令。