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