跳过内容

原生兼容性

一个 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 应用程序的一部分 — Cordova 插件、原生依赖项和原生项目配置,编译到已安装的二进制文件中。当一个新捆绑包期望原生 __CAPGO_KEEP_1__,而已安装的二进制文件没有时,该捆绑包是: Capgo 可能仍然能够正常运行,但在仍在运行旧版原生构建的设备上可能会崩溃或异常行为。

This page explains how Capgo 检测原生兼容性,什么是不兼容的更新意味着对用户的影响,以及如何安全地将原生更改部署。

TLDR: OTA 或原生?

标题:TLDR: OTA 或原生?

Capgo 可以从您的生成的 Web 构建文件夹中发送文件。如果更改仅影响 HTML、CSS、JavaScript、资产或纯 JavaScript 包,打包到输出中的,那么您可以将其作为实时更新。

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

更改是否使用Capgo OTA?为什么
HTML、CSS、应用程序JavaScript、图像、字体和其他Web构建资产它们是在运行时从Web包中加载的。
纯JavaScript包更改打包到您的Web输出中生成的JavaScript是Web包的一部分。
capacitor.config.ts 更改Capacitor配置在构建时读入原生应用。
添加、删除或升级 Capacitor/Cordova 插件已安装的本机二进制文件必须包含匹配的本机 code。
iOS 或 Android 项目文件更改现有用户需要从商店获取新的二进制文件。

客户端插件按栈排列

标题:客户端插件按栈排列

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

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

无论客户端插件如何,native 兼容性检查都适用 — 它们将bundle的记录native依赖项与安装的二进制文件进行比较。

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

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

A live update only swaps the JavaScript layer. If the new JavaScript calls a native plugin or API that isn’t compiled into the installed binary, the call fails at runtime — which can crash the app or silently break a feature. In short, Capgo cannot update native code, so a device running the old native build can’t safely run a bundle that was built against new native code.

当您上传一个包装文件 — 或者手动运行检查 — 时,Capgo会将 本地项目中的原生包(您的__CAPGO_KEEP_0__/Cordova插件及其版本)与包装文件 in your local project (your Capacitor/Cordova plugins and their versions) against the native packages recorded for the bundle 进行比较:

  • 如果它们匹配,改变仅为JavaScript-only, 安全地通过无线电发送.
  • 如果添加了、删除了或更改了插件版本,包装文件是 原生不兼容 — 这些更改只在用户安装新原生二进制文件后才会生效。
终端窗口
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_1__,Capgo将向您发出警告。 如果您在上线不兼容捆绑包时启用了__CAPGO_KEEP_1__,Capgo将向您发出警告。, 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’s 自动回滚 可以捕获在 JavaScript 之前抛出的错误 notifyAppReady() 运行,但这并不是发布兼容的本机 code 的替代品 —— 一种不匹配导致后期崩溃,或本机崩溃,可能会绕过它

如何安全地发布本机更改

如何安全地发布本机更改

发布一个新的本机构建(真正的修复)

发布一个新的本机构建(真正的修复)

当一个捆绑包需要新的本机 code 时,构建并提交一个新的二进制文件到 App Store / Play Store(或重建使用 Capgo Cloud Build)。一旦用户更新了二进制文件,捆绑包的本机依赖项就会对齐,live 更新就能正确运行

回滚 回滚.

防止不兼容的交付

防止不兼容的交付

两个互补的守卫,实际上都检查了你的原生包:

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

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

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

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

通过原生版本控制交付 — metadata + --auto-min-update-version

当您 将原生构建和捆绑包一起发送,设置 metadata 策略并上传 --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:

__CAPGO_KEEP_1__
# 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捆绑包引用 兼容性和发布类型命令