Capgoでリアルタイム更新を理解する
リアルタイム更新は、Capacitorアプリの最も強力な機能の1つであり、アプリストアへの提出なしでリアルタイム更新が可能です。 Capgoがこの機能を実装する方法について、深く掘り下げてみましょう。
基本概念
Capacitorアプリは、2つの主なレイヤーから構成されます。
- Web Layer: WebViewで読み込まれるHTML、CSS、JavaScriptファイルを含みます。
- Native Layer: Android用にJava/Kotlin、iOS用にSwiftのプラットフォーム固有のcodeを含みます。
Capgoのリアルタイム更新システムは、Webレイヤーを実行時で置き換えることで機能し、これらのファイルはアプリバイナリにコンパイルされていないためです。
技術的実装
サーバーパス in Capacitor
Capgo は、以下の 2 つの重要なパスを管理します:
- 現在のサーバーパス: 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_KEEP_0__のライブアップデートにおけるエンドツーワンエンド暗号化について学びましょう。 Capgoライブアップデートにおけるエンドツーワンエンド暗号化
アップデートのセキュリティプロセス
-
アップロード前に暗号化:
- CI/CD Pipelinesでアップデートが暗号化されます。
- 各ファイルは個別に暗号化されます。
- メタデータも完全なプライバシーを確保するために暗号化されます。
-
セキュアなストレージ:
- 暗号化されたバンドルは、CapgoのグローバルCDNに保存されます。
- サーバーにプランテキストデータが触れることはありません。
- サーバーブリーチの場合でも、データは安全に保たれます。
-
保護された配信:
- アップデートは暗号化されたチャンネルを通じて配信されます。
- 各アプリインスタンスは暗号化の整合性を検証します。
- 暗号化の失敗に対する自動リトライ機構
-
クライアントサイドセキュリティ:
- アップデートはインストール前に検証されます。
- 暗号化の失敗がトリガーとなって自動ロールバックが実行されます。
- アプリの保護されたストレージ内に安全に鍵を保存します。
この包括的なセキュリティアプローチにより、アプリのアップデートは次の攻撃から保護されます。
- 中間者攻撃
- サーバーサイドの侵害
- 未承認の変更
- 再生攻撃
- コンテンツの改ざん
アップデートライフサイクル
Capgoのアップデートプロセスは、デフォルトでは自動化されています。自動化プロセスは次のとおりです。
1. 自動アップデートチェック
プラグインは次の状況で自動的にアップデートをチェックします。
- アプリ起動時
この動作は、以下の設定によって制御されます。 autoUpdate 手動で確認することもできます。
// capacitor.config.json
{
"plugins": {
"CapacitorUpdater": {
"autoUpdate": true // Enable automatic updates
}
}
}
2. 自動ダウンロード getLatest()
3. 自動インストール
When a new version is detected, if __CAPGO_KEEP_0__ is enabled: 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)
}
}
}
インストールは次の場合に実行されます。
- __CAPGO_KEEP_0__ が true の場合、すぐにインストールされます。
directUpdate__CAPGO_KEEP_1__ - 次のアプリのバックグラウンド化時
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'
}
]
});
利用可能な遅延条件:
- バックグラウンド: 背景時にインストールする
- : 指定された日時以降にインストールする: 次のネイティブアップデート以降にインストールする
- : アプリが終了された後インストールする: この機能は便利です
- : オフピーク時間帯にスケジュールする: ユーザー活動と調整する
: スムーズなアップデート体験を確保する
- : クリティカルタスク中の混乱を防ぐ
- __CAPGO_KEEP_0__
- __CAPGO_KEEP_0__
- __CAPGO_KEEP_0__
アップデート状態
自動プロセス中、バンドルは次の状態を通過します:
- ダウンロード中ダウンロード中
- ダウンロード完了、インストール待機中アップデートインストール完了、有効
- アップデートインストール失敗 (自動ロールバックトリガー)ストアの適合性
- Apple App Store ✅__CAPGO_KEEP_0__
__CAPGO_KEEP_0__
__CAPGO_KEEP_0__
Apple App Store のポリシーに完全に準拠しています。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 は、Webview のコンテンツのみを更新するため、これらの許可されたガイドラインに従っています。
ベストプラクティス
- フェーズドロールアウト: アップデートを段階的に実行
- バージョン管理: 実行されたすべてのバージョンを追跡
- ロールバックサポート: 問題の迅速な復旧
- デルタアップデート: 変更されたファイルのみダウンロード
ライブアップデートの使用時期
適切な使用例:
- バグ修正
- UI改善
- コンテンツ更新
- 機能切り替え
不適切な使用例:
- ネイティブ code 変更
- メジャーバージョンアップデート
- ネイティブ変更を必要とするセキュリティパッチ
Capgoの「ライブアップデートのしくみ」から続けて
__CAPGO_KEEP_0__を使用している場合 How Live Updates Work in Capgo __CAPGO_KEEP_0__を使用して Capgo プラグイン ディレクトリ Capgo プラグイン ディレクトリの製品ワークフロー Capacitor Plugins by Capgo CapgoによるCapacitor プラグイン __CAPGO_KEEP_0__ プラグイン __CAPGO_KEEP_1__による__CAPGO_KEEP_0__ プラグインの実装詳細 Ionic Enterprise Plugin Alternatives Ionic Enterprise Plugin Alternativesの製品ワークフローについて Capgo Native Builds Capgo Native Buildsの製品ワークフローについて