了解 Capgo 中的实时更新
实时更新是 Capacitor 应用中的一个强大功能,允许在不通过应用商店提交的情况下进行实时更新。让我们深入了解 Capgo 如何实现此功能。
核心概念
A Capacitor 应用程序由两层组成:
- Web层:包含在 WebView 中加载的 HTML、CSS 和 JavaScript 文件
- 原生层:包含平台特定的 code (Android 为 Java/Kotlin,iOS 为 Swift)
Capgo 的 live update 系统通过在运行时替换 Web Layer 来实现,这些文件并未编译到应用程序二进制文件中
技术实现
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签名,提供了真正的零知识安全。
端到端加密架构
-
端到端加密 (E2EE): 每个更新包在离开开发环境之前都使用 AES-256-GCM 加密。这种军用级加密确保了您的应用更新在整个交付过程中完全私密和安全。
-
零知识架构: 与其他 OTA 更新解决方案不同,Capgo 采用了真正的零知识加密。这意味着:
- 更新内容在上传前会被加密
- Capgo 服务器仅存储加密数据
- 解密仅在用户设备上发生
- 中间件无法访问您的更新内容
-
安全密钥管理:
- 加密密钥在您的CI/CD环境中生成并安全存储
- Capgo 服务器上的私钥不会触及
- 每个应用程序版本都可以使用唯一的加密密钥
- 密钥轮换支持以增强安全性
有关我们的加密系统的详细指南,请参阅我们的详细指南: Capgo Live Updates中的端到端加密
更新安全流程
-
加密上传:
- Capgo在CI/CD管道中为更新加密
- 每个文件都被单独加密
- 元数据也被加密,确保完全的隐私
-
安全存储:
- 加密的包在Capgo的全球CDN上存储
- 我们的服务器上永远不会有明文数据
- 即使在服务器被破坏的情况下,数据也保持安全
-
安全交付:
- 更新通过加密通道交付
- 每个应用实例都验证加密完整性
- 自动重试机制用于失败的解密
-
客户端安全性:
- 更新在安装前进行验证
- 解密失败会触发自动回滚
- 应用程序的受保护存储中存储安全密钥
本全面安全方案确保您的应用程序更新始终受到以下保护:
- 中间人攻击
- 服务器端泄露
- 未经授权的修改
- 重放攻击
- 内容篡改
更新生命周期
Capgo的更新过程默认为自动化。以下是自动化过程的工作原理:
1. 自动更新检查
插件在以下情况下自动检查更新:
- 应用启动时
此行为由以下设置控制: autoUpdate 您也可以手动检查更新使用
// capacitor.config.json
{
"plugins": {
"CapacitorUpdater": {
"autoUpdate": true // Enable automatic updates
}
}
}
2. 自动下载 getLatest()
当检测到新版本时,如果
自动下载启用: autoUpdate 下载开始自动
- 进度被内部跟踪
- 下载失败会在应用每次打开时自动重试
- setting:
- 下载成功的文件存储在应用程序存储中
您可以通过事件监控此过程:
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 - 在下一次应用程序后台运行时如果
directUpdate是 false - 自动回滚如果安装失败
插件还自动管理存储:
- 删除失败的更新如果
autoDeleteFailedLive Update - 清理旧版本
autoDeletePreviousLive Update
延迟更新
您可以控制更新安装的时间使用延迟条件:
// 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'
}
]
});
可用的延迟条件:
- 后台: 应用程序进入后台时安装
- 日期: 在特定日期/时间后安装
- 原生版本: 在下一次原生更新后安装
- 杀死: 安装后杀死应用
这对以下有用:
- 在非高峰时段预订更新
- 与用户活动协调更新
- 确保平滑的更新体验
- 防止在关键任务期间中断
更新状态
在自动过程中,捆绑包会通过以下状态转换:
- 下载中: 下载进行中
- 待定: 下载完成,等待安装
- 成功: 更新已安装并激活
- 错误: 更新失败(触发自动回滚)
商店合规
苹果应用商店 ✅
Live Updates 完全符合苹果应用商店政策。根据苹果开发者计划许可协议:
“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 层,同时尊重所有平台安全边界。
谷歌-play商店 ✅
Live Updates 符合 Google Play 政策。设备和网络滥用政策特别指出:
“本限制不适用于在虚拟机或解释器中运行的code,前者提供了对Android API的间接访问(例如在浏览器或webview中运行的JavaScript)。”
由于Capgo仅更新webview内容,因此它符合这些允许的指南。
最佳实践
- 阶段性发布:逐步发布更新
- 版本控制:跟踪所有部署的版本
- 回滚支持:快速恢复问题
- 差分更新:仅下载更改的文件
何时使用实时更新
适用于:
- 修复 Bug
- UI 改进
- 内容更新
- 功能开关
不适用于:
- 原生 code 变更
- 重大版本更新
- 需要原生变更的安全补丁
Keep going from How Live Updates Work in Capgo
如果您正在使用《Capacitor Live Updates 是如何工作的》 How Live Updates Work in Capgo 为了规划原生插件工作,连接它与 Capgo 插件目录 为了产品工作流程在 Capgo 插件目录中 Capacitor 插件由 Capgo 为了实现细节在 Capacitor 插件由 Capgo 中 添加或更新插件 为了实现细节在添加或更新插件中 Ionic 企业插件替代品 为了产品工作流程在 Ionic 企业插件替代品中, Capgo 原生构建 为了产品工作流程在 Capgo 原生构建中。