Understanding Live Updates in Capgo
Live updates are one of the most powerful features in Capacitor apps, allowing real-time updates without app store submissions. Let’s dive deep into how Capgo implements this functionality.
Core Concepts
Capacitorアプリは、2つの主なレイヤーから構成されます:
- Web Layer: WebView内に読み込まれるHTML、CSS、JavaScriptファイルを含みます
- Native Layer: Android用はJava/Kotlin、iOS用はSwiftで構成されるプラットフォーム固有のcodeを含みます
Capgoのライブアップデートシステムは、実行時でWebレイヤーを置き換えることで機能し、これらのファイルはアプリバイナリにコンパイルされていないためです。
Technical Implementation
Capacitorのサーバーパス
Capgoは2つの重要なパスを管理します:
- Current Server Path: 現在WebView内に読み込まれているファイルへの参照
- サーバー パス: __CAPGO_KEEP_0__ が再起動後のアプリ起動時に読み込むファイルを指します。
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 暗号化を使用して、各アップデート バンドルが暗号化されます。
-
ゼロ知識アーキテクチャ: Capgoは他のOTAアップデートソリューションとは異なり、実際のゼロ知識暗号化を採用しています。これは次のことを意味します:
- アップデート内容はアップロード前に暗号化されます
- Capgoサーバーは暗号化されたデータのみを保存します
- デバイス上でのみ暗号化が行われます
- 中間者はアップデート内容にアクセスできません
-
セキュアなキー管理:
- 暗号化キーはCI/CD環境で安全に生成および保存されます
- プライベートキーはCapgoサーバーに到達することはありません
- 各アプリバージョンごとに一意の暗号化キーを使用できます
- キーローテーション機能を使用してセキュリティを強化
詳細なガイドで__CAPGO_KEEP_0__ Live Updatesの暗号化システムについて学びましょう: Capgo Live Updatesにおけるエンドツーヘンド暗号化
セキュリティプロセスをアップデート
-
プレ・アップロード暗号化:
- __CAPGO_KEEP_0__のCI/CDパイプラインでアップデートが暗号化されます
- 各ファイルは個別に暗号化されます
- 完全なプライバシーを確保するために、メタデータも暗号化されます
-
セキュアストレージ:
- CapgoのグローバルCDNに暗号化されたバンドルが保存されます
- サーバーにプランテキストデータは触れられません
- サーバーブレーチの場合でも、データはセキュアです
-
セキュアデリバリ:
- 暗号化されたチャンネルを通じてアップデートが配信されます
- 各アプリインスタンスは暗号化の整合性を検証します
- __CAPGO_KEEP_0__
-
クライアントサイドセキュリティ:
- インストール前にアップデートが検証されます
- __CAPGO_KEEP_0__
- アプリの保護されたストレージ内で安全に鍵を保存
この包括的なセキュリティアプローチにより、アップデートが次の攻撃から保護されます:
- 中間者攻撃
- サーバーサイドの侵害
- 未承認の変更
- リプレイ攻撃
- コンテンツの改ざん
アップデートライフサイクル
Capgoの自動更新プロセスは、デフォルトで自動化されています。 以下は自動プロセスのしくみです。
1. 自動更新確認
プラグインは、以下の状況で自動的に更新を確認します。
- アプリ起動時
この動作は、以下の設定によって制御されます。 autoUpdate 設定:
// capacitor.config.json
{
"plugins": {
"CapacitorUpdater": {
"autoUpdate": true // Enable automatic updates
}
}
}
また、手動で確認することもできます。 getLatest()
2. 自動ダウンロード
新しいバージョンが検出された場合、以下の設定が有効の場合、ダウンロードが自動的に開始されます。 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はtrueの場合 - アプリのバックグラウンド化次に実行されます。
directUpdateはfalseの場合 - インストールが失敗した場合にロールバックが自動的に実行されます。
プラグインは、ストレージの管理も自動的に行います。
- 失敗した更新を削除する
autoDeleteFailed__CAPGO_KEEP_0__が真の場合 - 古いバージョンをクリーンアップする
autoDeletePrevious__CAPGO_KEEP_0__が真の場合
更新の遅延
更新の遅延を使用して、更新のインストール時刻を制御できます。
// 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'
}
]
});
利用可能な遅延条件:
- バックグラウンド: アプリがバックグラウンドに移動したときにインストール
- 日時: 特定の日時以降にインストール
- 古いネイティブバージョン: コュードに更新していなた
- 消息: モーバーに更新していなた
コュードに当前で会なた。
- コュードに当前で会なた。
- コュードに当前で会なた。
- コュードに当前で会なた。
- コュードに当前で会なた。
コュードに当前で会なた。
コュードに当前で会なた。
- コュードに当前で会なた。コュードに当前で会なた。
- 保留中: ダウンロード完了、インストール待機中
- 成功: インストール済みの更新とアクティブ
- エラー: 更新失敗(自動ロールバックトリガー)
ストアの適合性
Apple App Store
ライブアップデートは、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 は、Application にダウンロードされる可能性がありますが、そのような __CAPGO_KEEP_1__: (a) Application の主な目的を変更しない限り、(b) 提交された Application の意図したとadvertised の目的と一致しない機能または機能を提供しない限り、(c) Application の他の __CAPGO_KEEP_2__ またはアプリケーションを作成しない限り、(d) OS の署名、サンドボックス、またはセキュリティ機能をバイパスしない限り、
__CAPGO_KEEP_0__ の更新は、プラットフォームのセキュリティ境界を尊重しながら、Web 層のみを変更します。
Google Play ポリシーに準拠したリアルタイム更新
「この制限は、仮想マシンまたはインタプリタで実行される code に適用されない。仮想マシンまたはインタプリタが Android API に間接的にアクセスできる場合 (例: JavaScript を使用したウェブビューまたはブラウザ)」
Capgo はウェブビューのコンテンツのみを更新するため、これらの許可されたガイドラインに該当する。
ベストプラクティス
- フェーズドロールアウト: スローモードで更新を実行
- バージョン管理: 部署されたすべてのバージョンを追跡
- ロールバックサポート: 問題の迅速な回復
- デルタアップデート: 変更されたファイルのみをダウンロード
ライブ更新の使用時期
適切な使用例:
- バグ修正
- UIの改善
- コンテンツの更新
- 機能の切り替え
不適切な使用例:
- ネイティブ code の変更
- メジャーバージョンの更新
- ネイティブの変更が必要なセキュリティパッチ