メインコンテンツにジャンプします

How Live Updates Work in Capgo

Deep dive into the technical implementation of live updates in Capgo, understanding how it works under the hood for both iOS and Android.

著者

マーティン・ドナディュー

ライター

バレリア

レビュー

ジョーダン

編集者

How Live Updates Work in Capgo

Capgoで実現されるライブアップデートの理解

Capacitorアプリでは、ライブアップデート機能が最も強力な機能の1つであり、実時間でアップデートを行うことができます。アプリストアへの提出を必要とせずに、Capgoはこの機能を実装する方法について、深く掘り下げてみましょう。

基本概念

Capacitorアプリは、2つの主な層で構成されています。

  1. Web層: WebViewで読み込まれるHTML、CSS、JavaScriptファイルを含みます。
  2. ネイティブ層: Android用にはJava/Kotlin、iOS用にはSwiftで構築されたプラットフォーム固有のcodeを含みます。

Capgoのライブアップデートシステムは、Web層を実行時で置き換えることで機能し、これらのファイルはアプリバイナリにコンパイルされていないためです。

技術的実装

Server Paths in Capacitor

Capgo manages two critical paths:

  • 現在のサーバーパス:現在のWebViewで読み込まれているファイルにアクセスします
  • 次のサーバーパス:アプリ再起動後に読み込まれるファイルにアクセスします

Androidの実装

On Android, Capgo manages paths through:

// 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 implements military-grade security through end-to-end encryption, ensuring your app updates remain completely secure from development to deployment. Our encryption system goes beyond traditional code signing to provide true zero-knowledge security.

エンドツエンド暗号化アーキテクチャ

  1. エンドツエンド暗号化(E2EE):あなたの開発環境を出発する前に、すべてのアップデートバンドルはAES-256-GCM暗号化を使用して暗号化されます。この軍事級の暗号化により、すべてのアップデートが完全にプライベートで安全な状態で、すべての配信プロセスを通じて保証されます。

  2. ゼロ知識アーキテクチャ:他のOTAアップデートソリューションはアップデートを署名するのみで、Capgoは真のゼロ知識暗号化を採用しています。これは意味する

    • アップデート内容はアップロードする前に暗号化されます
    • Capgoサーバーは暗号化されたデータのみを保存します
    • エンドユーザー機器上でのみデコードが行われます
    • 中間者はアップデートコンテンツにアクセスできません
  3. セキュアな鍵管理:

    • 暗号化鍵はあなたのCI/CD環境で生成され、安全に保存されます
    • プライベート鍵はCapgoサーバーに触れません
    • 各アプリバージョンは、独自の暗号化キーを使用できます。
    • キー回転機能を使用してセキュリティを強化します。

詳細なガイドで、__CAPGO_KEEP_0__のLive UpdatesにおけるEnd-to-End Encryptionについて学びましょう。 End-to-End Encryption in Capgo Live Updates

アップロード前に暗号化

  1. CI/CD Pipelinesでファイルごとに暗号化:

    • 各ファイルは個別に暗号化されます。
    • メタデータも完全なプライバシーを確保するために暗号化されます。
    • セキュアなストレージ
  2. 暗号化されたバンドルは、__CAPGO_KEEP_0__のグローバルCDNに保存されます。:

    • Encrypted bundles are stored on Capgo’s global CDN
    • 各アプリバージョンは独自の暗号化キーを使用することができます。
    • サーバーブレーチの場合でも、データは安全に保たれます。
  3. セキュアデリバリー:

    • アップデートは暗号化されたチャンネルを通じて配信されます。
    • 各アプリインスタンスは暗号化の整合性を検証します。
    • 暗号化失敗の自動リトライ機構
  4. クライアントサイドセキュリティ:

    • アップデートはインストール前に検証されます。
    • 暗号化失敗により自動ロールバックがトリガーされます。
    • アプリの保護されたストレージ内にセキュアなキーが保存されます。

この包括的なセキュリティアプローチにより、アプリのアップデートは次の攻撃から保護されます。

  • 中間者攻撃
  • サーバーサイドの侵害
  • 未承認の変更
  • リプレイ攻撃
  • コンテンツの改ざん

アップデートのライフサイクル

Capgoのアップデートプロセスは、自動化されたデフォルトの設定で設計されています。ここでは、自動化されたプロセスがどのように動作するかを説明します。

1. 自動アップデートのチェック

プラグインは、以下の状況で自動的にアップデートをチェックします。

  • アプリが起動したとき

この動作は、以下の設定によって制御されます。 autoUpdate 設定

// capacitor.config.json
{
  "plugins": {
    "CapacitorUpdater": {
      "autoUpdate": true // Enable automatic updates
    }
  }
}

手動で確認することもできます。 getLatest()

2. 自動ダウンロード

新バージョンが検出された場合、もし autoUpdate が有効である場合:

  1. 自動でダウンロードが始まります
  2. 進行状況は内部で追跡されます
  3. ダウンロードが失敗した場合、各アプリ起動時に自動で再試行されます
  4. ダウンロードが成功した場合、アプリストレージに保存されます

このプロセスを監視するには、イベントを参照してください:

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 items
  • On the next app backgrounding if directUpdate is false
  • インストール失敗時に自動ロールバック

The plugin also automatically manages storage:

  • Capacitorプラグインは、次のストレージ管理も行います: autoDeleteFailed is true
  • 失敗した更新を削除する場合 autoDeletePrevious is true

古いバージョンを削除する場合

You can control when updates are installed using delay conditions:

// 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'
    }
  ]
});

更新の遅延

  • 更新の遅延を制御するには、次の条件を使用します。遅延条件は次のとおりです。: アプリがバックグラウンドに移動したときにインストール
  • date: 特定の日時以降にインストール
  • nativeVersion: 次のネイティブアップデート以降にインストール
  • kill: アプリが終了した後インストール

This is useful for:

  • アプリの更新をオフピーク時間にスケジュールする
  • ユーザーの活動と更新を調整する
  • スムーズな更新体験を確保する
  • 重要なタスク中のディザスターを防ぐ

アップデート状態

自動プロセス中、バンドルは次の状態を通過します:

  1. ダウンロード中: ダウンロード中
  2. 準備中: ダウンロード完了、インストール待機中
  3. 成功: アップデートがインストールされ、有効
  4. エラー: アップデートが失敗 (自動ロールバックをトリガー)

ストアの準拠

Apple App Store

Live UpdatesはApple App Storeのポリシーに完全に準拠しています。Apple Developer Program License Agreementに記載されているとおりです。

“解釈されたcodeは、Applicationにダウンロードできますが、そのようなcode: (a) Applicationの主な目的を変更する機能または機能を提供しない限り、(b) 他のcodeまたはアプリケーションを含むストアまたはストアフロントを作成しない限り、(c) OSの署名、サンドボックス、またはセキュリティ機能をバイパスしない限り、ダウンロードできます。”

Capgoの更新は、プラットフォームのセキュリティ境界を尊重しながら、Web層のみを更新します。

Google Play Store ✅

Live UpdatesはGoogle Play Policiesに準拠しています。デバイスとネットワークの乱用ポリシーには、以下のように記載されています。

“この制限は、codeが仮想マシンまたはインタプリタで実行されている場合、またはそれらがAndroid APIに間接的なアクセスを提供している場合にのみ適用されます。”

Capgoは、Web Viewのコンテンツのみを更新するため、これらの許可されたガイドラインに従っています。

ベストプラクティス

  1. フェーズドロールアウト: Deploy updates gradually
  2. バージョン管理: Track all deployed versions
  3. ロールバックサポート: 問題の迅速な回復
  4. Δ更新: 変更したファイルのみダウンロード

ライブ更新の使用時期

適切な場合:

  • バグ修正
  • UIの改善
  • コンテンツの更新
  • 機能の切り替え

不適切な場合:

  • ネイティブ code の変更
  • Capacitorのメジャーバージョンアップデート
  • Capacitorのセキュリティパッチ

Keep going from How Live Updates Work in Capgo

Capacitorを使用している場合 How Live Updates Work in Capgo Capacitorを使用してnativeプラグインの作業を計画するには、Capacitorを__CAPGO_KEEP_0__プラグインディレクトリと接続する必要があります Capgo Plugin Directory for the product workflow in Capgo Plugin Directory, Capacitor Plugins by Capgo for the implementation detail in Capacitor Plugins by Capgo, Capacitorプラグインの追加または更新 Capacitorプラグインの追加または更新の実装詳細 Capacitorのライブアップデートのしくみ Capacitorのライブアップデートのしくみについて Capgoネイティブビルド for the product workflow in Capgo Native Builds.

ライブ更新の Capacitor アプリ

ウェブ層のバグがライブの場合、Capgo を通して修正を配信するのではなく、数日間待ってアプリストアの承認を待つのではなく、ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビューのパスを通る。

マーティンから人間のサポート

スタートする

最新のブログ

Capgo gives you the best insights you need to create a truly professional mobile app.