Capgoのリアルタイム更新機能の理解
Capacitorアプリは、リアルタイム更新機能を実装するために最も強力な機能の1つを持っています。これにより、アプリストアへの提出なしでリアルタイム更新が可能になります。Capgoがこの機能をどのように実装しているのかを深く掘り下げてみましょう。
基本概念
Capacitorアプリは、2つの主なレイヤーで構成されています。
- Web Layer: WebView内に読み込まれるHTML、CSS、JavaScriptファイルを含みます。
- Native Layer: Android用にJava/Kotlin、iOS用にSwiftで構築されたcodeを含みます。
Capgoのライブ更新システムは、実行時でWeb Layerを置き換えることで機能します。これらのファイルはアプリバイナリにコンパイルされていないためです。
Technical Implementation
Capacitorのサーバーパス
Capgoは2つの重要なパスを管理します。
- Current Server Path: 現在WebViewで読み込まれているファイルにアクセスします。
- Next Server Path: 次のアプリ再起動時に読み込まれるファイルにアクセスします。
Android Implementation
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 Implementation
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)
}
Security Measures
Capgoは軍用レベルのセキュリティを実現するために、開発からデプロイまでのすべてのアップデートが完全に安全であることを保証するエンドツーヘンド暗号化を実装しています。 伝統的なcode署名に加えて、完全なゼロ知識セキュリティを提供するエンコードシステムを提供します。
End-to-End Encryption Architecture
-
エンドツーヘンド暗号化 (E2EE): 開発環境を離れる前に、すべてのアップデートパッケージはAES-256-GCM暗号化を使用して暗号化されます。これにより、軍用レベルの暗号化が実現され、すべてのアップデートが完全にプライベートで安全であることを保証します。
-
Zero-Knowledge Architecture: 他のOTAアップデートソリューションがアップデートを署名するのみならず、Capgoは完全なゼロ知識暗号化を採用しています。これは次のことを意味します。
- Update contents are encrypted before upload
- Capgoサーバーは暗号化されたデータのみを保存します。
- 暗号化はエンドユーザー機器上のみ行われます。
- 中間者はあなたの更新コンテンツにアクセスできません。
-
セキュアなキー管理:
- 暗号化キーはあなたのCI/CD環境で安全に生成され、保存されます。
- Capgoサーバーにはプライベートキーが触れられません。
- 各アプリバージョンは独自の暗号化キーを使用できます。
- キー回転機能はセキュリティの向上を目的としています。
__CAPGO_KEEP_0__ Live Updatesの詳細なガイドで、暗号化システムについて学びましょう。 Capgo Live Updatesの更新セキュリティプロセス
アップロード前暗号化
-
__CAPGO_KEEP_0__ Live Updatesの詳細なガイド:
- CI/CD_PIPELINEで暗号化された更新
- 各ファイルごとに暗号化されます
- メタデータも完全なプライバシーを確保するために暗号化されます
-
Secure Storage:
- CapgoのグローバルCDNに暗号化されたバンドルが保存されます
- サーバーにプランテキストデータは触れられません
- サーバーブレーチャスの場合でもデータは安全です
-
Secure Delivery:
- 暗号化されたチャンネルを通じて更新が配信されます
- 各アプリインスタンスは暗号化の整合性を検証します
- 暗号化失敗の場合の自動リトライメカニズム
-
クライアントサイドセキュリティ:
- アップデートはインストール前に検証されます
- 暗号化の失敗は自動ロールバックをトリガーします
- アプリの保護されたストレージ内で安全な鍵の保存
この包括的なセキュリティアプローチにより、更新が次の攻撃から保護されます:
- 中間者攻撃
- サーバーサイドの侵害
- 未承認の変更
- リプレイ攻撃
- コンテンツの改ざん
アップデートライフサイクル
Capgoのアップデートプロセスは、デフォルトで自動化されています。自動プロセスは次のとおりです:
1. 自動アップデートチェック
プラグインは、次の状況で自動的に更新を確認します:
- アプリ起動時
この動作は、以下の設定によって制御されます: autoUpdate 設定:
// capacitor.config.json
{
"plugins": {
"CapacitorUpdater": {
"autoUpdate": true // Enable automatic updates
}
}
}
また、手動で確認することもできます。 getLatest()
2. 自動ダウンロード
新しいバージョンが検出された場合、次の場合に自動ダウンロードが有効になっている場合: autoUpdate ダウンロードが自動的に開始されます
- 進行状況は内部で追跡されます
- 失敗したダウンロードはアプリ起動ごとに自動でリトライされます
- 正常にダウンロードされたファイルはアプリストレージに保存されます
- __CAPGO_KEEP_0__
このプロセスはイベントを通じて監視できます:
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が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'
}
]
});
利用可能な遅延条件
- バックグラウンドアプリがバックグラウンドに移動したときにインストール
- 日時指定された日時以降にインストール
- nativeVersionネイティブの次回の更新以降にインストール
- kill: __CAPGO_KEEP_0__
This is useful for:
- オフピーク時間帯に更新をスケジュールする
- ユーザー活動と更新を調整する
- スムーズな更新体験を確保する
- 重要なタスク中の障害を防ぐ
更新状態
自動プロセス中、バンドルは次の状態を通過します:
- ダウンロード中: ダウンロード中
- 待機: ダウンロード完了、インストール待機
- 成功: インストール済みおよび有効
- エラー: 更新に失敗 (自動ロールバックをトリガー)
ストアの適合性
Apple App Store
Apple App Store のポリシーに完全に適合している Live Updates です。Apple Developer Program License Agreement に記載されているとおりです。
“解釈された code は、アプリケーションにダウンロードされることができますが、そのような code: (a) アプリケーションの主な目的を変更する機能または機能を提供しない限り、(b) 他の code またはアプリケーションを含むストアまたはショップを創設しない限り、(c) OS の署名、サンドボックス、またはセキュリティ機能を回避しない限り、”
Capgo の更新は、プラットフォームのセキュリティ境界を尊重しながら、Web 層のみを変更します。
Google Play Store
Live Updates は Google Play ポリシーに適合しています。デバイスとネットワークの乱用ポリシーによれば:
“この制限は、仮想マシンまたはインタプリタで実行される code に適用されない。どちらも、Android API に間接的なアクセスを提供する (例えば、JavaScript を使用した Webview またはブラウザ)。”
Capgoはウェブビューのコンテンツのみを更新するため、これらの許可されたガイドライン内に収まります。
ベストプラクティス
- フェイズドロールアウト: 逐次的な更新
- バージョン管理: 運用中のすべてのバージョンを追跡
- ロールバックサポート: 問題の回復に迅速な対応
- デルタアップデート: 変更されたファイルのみをダウンロード
ライブアップデートの使用時期
適切な使用例:
- バグ修正
- UI改善
- コンテンツ更新
- 機能切り替え
使用しない場合
- ネイティブcode変更
- メジャーバージョンアップデート
- セキュリティパッチがネイティブ変更を必要とする
How Live Updates Work in Capgoから続きます
__CAPGO_KEEP_0__を使用している場合 How Live Updates Work in Capgo ネイティブ プラグインの作業を計画するには、__CAPGO_KEEP_0__を接続する Capgo プラグイン ディレクトリ Capgo プラグイン ディレクトリの製品ワークフローについて Capacitor プラグインは Capgo によって提供されます Capacitor プラグインの実装詳細については Capgo によって提供されます プラグインの追加または更新 プラグインの追加または更新の実装詳細について Ionic Enterprise プラグインの代替 Ionic Enterprise プラグインの代替の製品ワークフローについて Capgo ネイティブ ビルド Capgo ネイティブ ビルドの製品ワークフローについて