跳转至正文

Capgo 中 Live Updates 的工作原理

深入探究 Capgo Live Update 的技术实现,了解其在 iOS 和 Android 端的底层工作原理。

Capgo 中 Live Updates 的工作原理

深入理解 Capgo 的 Live Updates

Capacitor Live Updates (OTA) 替换应用内的 Web bundle,让你无需重新提交应用商店二进制文件即可发布 JavaScript、HTML 和 CSS 的变更。Live Update 是 Capacitor 应用中最强大的功能之一,支持无需经过应用商店审核的实时更新。让我们深入了解 Capgo 是如何实现这一功能的。

核心概念

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

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

Capgo 的 live update 系统通过在运行时替换 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):每个更新 bundle 在离开开发环境前都会使用 AES-256-GCM 进行加密。这种军用级加密确保您的应用更新在整个交付过程中保持完全的私密与安全。

  2. 零知识架构:不同于仅对更新进行签名的其他 OTA 更新方案,Capgo 采用真正的零知识加密。这意味着:

    • 更新内容在上传前即已加密
    • Capgo 服务器仅存储加密数据
    • 解密仅在终端用户设备上进行
    • 任何中间方都无法访问您的更新内容
  3. 安全的密钥管理:

    • 加密密钥在您的 CI/CD 环境中生成并安全存储
    • 私钥绝不会接触 Capgo 的服务器
    • 每个 App 版本均可使用唯一的加密密钥
    • 支持密钥轮换以增强安全性

在我们的详细指南中进一步了解我们的加密系统: Capgo Live Updates 的端到端加密

更新安全流程

  1. 上传前加密:

    • 更新在您的 CI/CD pipeline 中完成加密
    • 每个文件都经过独立加密
    • 元数据也经过加密,确保完全隐私
  2. 安全存储:

    • 加密后的 bundle 存储在 Capgo 的全球 CDN 上
    • 任何明文数据都不会触及我们的服务器
    • 即使服务器遭到入侵,数据依然安全
  3. 安全交付:

    • 更新通过加密通道进行交付
    • 每个应用实例都会验证加密完整性
    • 解密失败时的自动重试机制
  4. 客户端安全:

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

这种全面的安全方案可确保您的应用更新免受以下威胁:

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

更新生命周期

Capgo 的更新流程默认设计为自动执行。以下是自动更新的工作原理:

1. 自动检查更新

插件会在以下场景中自动检查更新:

  • 应用启动时

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

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

您也可以通过以下方式手动检查: getLatest()

2. 自动下载

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

  1. 将自动开始下载
  2. 进度在内部进行追踪
  3. 下载失败时,每次打开 App 都会自动重试
  4. 下载成功后,文件将存储在 App 本地存储中

你可以通过以下事件来监控此过程:

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 为 true 时
  • 如果满足以下条件,则在下次 App 进入后台时安装: directUpdate 为 false 时
  • 如果安装失败,则自动回滚

该插件还会自动管理存储:

  • 如果满足以下条件,则移除失败的更新: autoDeleteFailed 为 true 时
  • 如果满足以下条件,则清理旧版本: autoDeletePrevious 为 true 时

延迟更新

你可以使用延迟条件控制更新的安装时机:

// 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'
    }
  ]
});

可用的延迟条件:

  • 后台: 应用进入后台时安装
  • 日期: 在指定日期/时间后安装
  • nativeVersion: 下次 Native Build 更新后安装
  • kill: App 被杀进程后安装

这适用于:

  • 在非高峰时段安排更新
  • 配合用户活跃度进行更新
  • 确保流畅的更新体验
  • 避免在关键任务期间中断

更新状态

在自动处理过程中,bundle 会经历以下状态:

  1. 正在下载: 下载中
  2. 等待中: 下载完成,等待安装
  3. 成功: 更新已安装并生效
  4. 错误: 更新失败(将触发自动回滚)

应用商店合规性

Apple App Store ✅

Live Updates 完全符合 Apple App Store 的政策。正如 Apple Developer Program License Agreement 中所述:

“解释型 code 可下载到应用程序中,但前提是该 code:(a) 不得通过提供与提交至 App Store 时所述及宣传的用途不一致的功能或特性,改变应用程序的主要用途;(b) 不得为其他 code 或应用程序创建商店或店面;(c) 不得绕过操作系统的签名、沙盒或其他安全特性。”

Capgo 更新仅修改 Web 层,同时严格遵守所有平台的安全边界。

Google Play Store ✅

Live Updates 符合 Google Play 政策。其中“设备与网络滥用”政策明确规定:

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

由于 Capgo 仅更新 WebView 内容,因此属于这些允许的准则范围。

最佳实践

  1. 分阶段发布: 逐步部署更新
  2. 版本控制: 追踪所有已部署版本
  3. 回滚支持: 快速从问题中恢复
  4. 增量更新: 仅下载变更文件

何时使用 Live Updates

适用场景:

  • Bug 修复
  • UI 优化
  • 内容更新
  • 功能开关

不适用场景:

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

继续阅读:Capgo 中的 Live Updates 工作原理

如果你正在使用 Capgo 中 Live Updates 的工作原理 要规划原生插件工作,请将其与 Capgo 插件目录 查看 Capgo 插件目录中的产品工作流, Capgo 提供的 Capacitor 插件 查看由 Capgo 提供的 Capacitor 插件中的实现细节, 添加或更新插件 查看添加或更新插件中的实现细节, Ionic Enterprise 插件替代方案 查看 Ionic Enterprise 插件替代方案中的产品工作流,以及 Capgo Native Build 查看 Capgo Native Builds 中的产品工作流。

为 Capacitor 应用提供 Live Updates

当 Web 层出现线上 Bug 时,通过 Capgo 发布修复,而不用等 App Store 审核好几天。用户会在后台收到更新,原生变更则仍走正常审核流程。

博客最新动态

Capgo 为你提供打造真正专业的移动应用所需的最有价值的洞察。