跳过主要内容

如何在Capgo中实现实时更新

深入了解Capgo中实时更新的技术实现,了解如何在iOS和Android平台下实现实时更新的原理。

文章来源

马丁·多纳迪厄

作者

瓦莱里娅

Reviewer

Jordan

编辑

如何Capgo实时更新工作

理解Capgo实时更新

实时更新是Capacitor应用中最强大的功能之一,允许实时更新而无需提交应用商店。让我们深入了解Capgo如何实现此功能。

核心概念

一个Capacitor应用由两个主要层次组成:

  1. Web层:包含在WebView中加载的HTML、CSS和JavaScript文件
  2. Native层:包含平台特定的code(Android为Java/Kotlin,iOS为Swift)

Capgo的实时更新系统通过在运行时替换Web层来工作,因为这些文件并未编译到应用程序二进制文件中。

技术实施

Capacitor中的服务器路径

Capgo管理两个关键路径:

  • 当前服务器路径:指向WebView中当前加载的文件
  • 下一个服务器路径:指向将在下一次应用程序重启时加载的文件

Android实施

在Android上,Capgo通过以下方式管理路径:

// Store next server path
private void setNextCapacitorServerPath(String path) {
    SharedPreferences prefs = context.getSharedPreferences("CapWebViewSettings", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("serverBasePath", path);
    editor.apply();
}

// Update current path and reload
private void setCurrentCapacitorServerPath(String path) {
    bridge.setServerBasePath(path);
    bridge.reload();
}

iOS实施

在iOS上,路径通过以下方式管理:

// Store next server path
private func setNextCapacitorServerPath(path: String) {
    KeyValueStore.standard["serverBasePath"] = path
}

// Update current path
private func setCurrentCapacitorServerPath(path: String) {
    bridge.viewController.setServerBasePath(path: path)
}

安全措施

Capgo 实现了军用级安全性,通过端到端加密,确保您的应用程序更新始终保持安全,从开发到部署。我们的加密系统超越了传统的 code 签名,提供真正的零知识安全。

端到端加密架构

  1. 端到端加密(E2EE): 每个更新包在离开开发环境之前都使用 AES-256-GCM 加密。这种军用级加密确保了您的应用程序更新始终保持完全私密和安全,整个交付过程中都如此。

  2. 零知识架构: 与其他 OTA 更新解决方案不同,Capgo 采用了真正的零知识加密。这意味着:

    • 更新内容在上传之前被加密
    • Capgo 服务器只存储加密数据
    • 只有在终端设备上才会解密
    • 中间件无法访问您的更新内容
  3. 安全密钥管理:

    • 在您的CI/CD环境中生成并安全存储加密密钥
    • 私钥永远不会触及Capgo的服务器
    • 每个应用程序版本都可以使用独特的加密密钥
    • 为增强安全性提供密钥轮换支持

有关我们的加密系统的详细指南,请参阅: Capgo Live Updates中的端到端加密

更新安全流程

  1. 预上传加密:

    • 在CI/CD管道中对更新进行加密
    • 每个文件都单独加密
    • 元数据也加密以实现完全隐私
  2. 安全存储:

    • 加密的包裹存储在Capgo的全球CDN中
    • 我们的服务器上永远不会有明文数据
    • 即使服务器被破坏,数据也仍然安全
  3. 安全交付:

    • 更新通过加密通道传递
    • 每个应用实例都验证了加密完整性
    • 失败的解密触发自动回滚
  4. 客户端安全:

    • 更新在安装之前被验证
    • 失败的解密触发自动回滚
    • 应用的受保护存储中存储安全密钥

这种全面安全的方法确保您的应用更新始终受到以下保护:

  • 中间人攻击
  • 服务器端泄露
  • 未经授权的修改
  • 重放攻击
  • 内容篡改

更新生命周期

Capgo的更新过程是默认自动化的。以下是自动化过程的工作原理:

1. 自动更新检查

插件在以下情况下自动检查更新:

  • 应用启动时

此行为由以下设置控制: autoUpdate setting:__CAPGO_KEEP_0__

// capacitor.config.json
{
  "plugins": {
    "CapacitorUpdater": {
      "autoUpdate": true // Enable automatic updates
    }
  }
}

您也可以手动检查 getLatest()

2. 自动下载

当检测到新版本时,如果 autoUpdate 启用:

  1. 下载自动开始
  2. 进度在内部跟踪
  3. 下载失败会在每次应用打开时自动重试
  4. 成功下载的文件存储在应用存储中

您可以通过事件监控此过程

CapacitorUpdater.addListener('download', (info: DownloadEvent) => {
  console.log('Auto-download progress:', info.percent);
});

CapacitorUpdater.addListener('downloadComplete', (info: DownloadCompleteEvent) => {
  console.log('Auto-download complete:', info.bundle);
});

3. 自动安装

安装的时间取决于您的配置

// capacitor.config.json
{
  "plugins": {
    "CapacitorUpdater": {
      "autoUpdate": true,
      "directUpdate": false // install update on app backgrounding
      "resetWhenUpdate": true, // reset live updates on native update (true by default)
      "autoDeleteFailed": true, // Auto cleanup failed updates (true by default)
      "autoDeletePrevious": true // Auto cleanup old versions (true by default)
    }
  }
}

安装发生在

  • 立即安装 directUpdate 为真
  • 下次应用后台时 directUpdate 为假
  • 安装失败时自动回滚

插件还会自动管理存储:

  • 移除失败的更新 autoDeleteFailed 为真
  • 清理旧版本 autoDeletePrevious 为真

延迟更新

您可以使用延迟条件控制更新何时安装

// Delay until app goes to background
await CapacitorUpdater.setDelay({
  kind: 'background'
});

// Delay until specific date
await CapacitorUpdater.setDelay({
  kind: 'date',
  value: '2024-03-20T10:00:00.000Z'
});

// Delay until next native version
await CapacitorUpdater.setDelay({
  kind: 'nativeVersion'
});

// Multiple conditions
await CapacitorUpdater.setMultiDelay({
  delayConditions: [
    {
      kind: 'background'
    },
    {
      kind: 'date',
      value: '2024-03-20T10:00:00.000Z'
    }
  ]
});

可用延迟条件:

  • 后台: 应用程序进入后台时安装
  • 日期: 安装在特定日期/时间
  • 原生版本: 安装下一个原生更新
  • 杀死: 应用程序被杀死后安装

这对以下有用:

  • 在非高峰时间调度更新
  • 与用户活动协调更新
  • 保证顺畅的更新体验
  • 防止在关键任务期间的中断

更新状态

在自动更新过程中,捆绑包会通过这些状态转换:

  1. 下载中: 下载进行中
  2. 等待安装: 下载完成,等待安装
  3. 更新成功: 更新已安装并激活
  4. 更新失败: 更新失败(触发自动回滚)

应用商店遵从性

Apple App Store ✅

Live Updates 完全遵守了 Apple App Store 政策。根据 Apple Developer Program License Agreement 的规定:

“Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS.”

Capgo 更新仅修改 web 层,同时尊重所有平台安全边界。

Google Play Store ✅

Live Updates 符合 Google Play Policies。设备和网络滥用政策特别规定:

“此限制不适用于在虚拟机或解释器中运行的 code,前者提供间接访问 Android API(例如在 webview 或浏览器中运行的 JavaScript)。”

由于 Capgo 只更新 WebView 内容,因此符合这些允许的指南。

最佳实践

  1. 阶段性发布: 部署更新逐步
  2. 版本控制: 跟踪所有部署的版本
  3. 回滚支持: 快速恢复问题
  4. 差分更新: 只下载更改的文件

何时使用实时更新

适用于:

  • bug 修复
  • UI 改进
  • 内容更新
  • 功能开关

Not suitable for:

  • Native code 的变更
  • 重大版本更新
  • 需要原生变更的安全补丁

Keep going from How Live Updates Work in Capgo

如果您正在使用 How Live Updates Work in Capgo 来规划原生插件的工作,连接它到 Capgo 插件目录 Capgo 插件目录中的产品工作流程 Capacitor 插件由 Capgo Capacitor 插件由 Capgo 的实现细节 添加或更新插件 为添加或更新插件的实现细节 Ionic企业插件替代品 为Ionic企业插件替代品的产品工作流程 Capgo原生构建 为Capgo原生构建的产品工作流程

实时更新Capacitor应用

当 Web 层 Bug 生效时,通过 Capgo 直接将修复推送至用户,而不是等待 App Store 审核几天。用户在后台接收更新,而原生代码仍在正常审查路径中。

来自 Martin 的人性化支持

立即开始

最新博客

Capgo 给您所需的最佳见解,帮助您创建真正专业的移动应用。