メインコンテンツへスキップ

モダンなアプリのための環境設定

Capacitor および Electron アプリの環境設定をマスターしましょう。12-factor、ランタイム設定、シークレット管理のパターンを比較します。

モダンなアプリのための環境設定

リリースを出荷し、ネイティブバイナリに署名し、本番ロールアウトが正常に始まるのを確認しました。すると、ユーザーが購入を完了できないとサポートから報告が入ります。クラッシュログは無関係に見えるため、リクエスト、プラグインの初期化、最近のJavaScript変更を何時間も追跡することになります。原因は、急いで作った本番ビルドにステージングの API URLが残っていたことでした。

こうした障害は珍しくありません。 環境設定 API のエンドポイント、フィーチャーフラグ、データベースの認証情報、サードパーティのキーなど、デプロイ環境に依存する設定を、アプリケーションの code から切り離して管理する手法を「環境設定」と呼びます。Capacitor や Electron アプリでは、Webアセットがネイティブコンテナ内にバンドルされるため、この分離はより困難になります。設定ミスがサーバー側で変更可能な値ではなく、署名済みアーティファクトの一部として組み込まれてしまうからです。

より根本的な問題は、 設定ドリフト、つまり開発・ステージング・本番の間で徐々に生じる乖離です。開発者が1つの .env ファイルを更新し、リリースエンジニアがCI変数を変更し、モバイルビルドが古い値をbundle内に保持したままになる、といった状況です。アプリはコンパイルできますが、各環境は同じシステムを表さなくなります。 Capacitor アプリにおける開発環境と本番環境の違いを理解しているチームは、 明らかなミスを回避できますが、ドリフトにはより良いファイル命名規則だけでなく運用モデルが必要です。

実用的な問いはシンプルです。構成変更のたびにネイティブアプリを再ビルド、再署名、ストアへ再申請することなく、どうすれば同じコードベースを複数の環境にデプロイできるでしょうか?

目次

環境設定が本番アプリを壊す理由

最もコストのかかる設定ミスは、一見して設定ミスとは分からないものです。API のベースURLが間違っているだけで、認証エラー、アカウント画面の空表示、決済エラー、あるいはネイティブプラグインのクラッシュとして表面化することがあります。ビルドパイプラインを担当するエンジニアに問題が届く頃には、元のミスは複数のコミットやストアへのリリースによって、すでに埋もれてしまっているかもしれません。

ハイブリッドアプリには特有の失敗パターンがあります。Capacitor はウェブアプリケーションをコンパイルし、そのアセットを iOS や Android プロジェクト内に配置します。Electron の場合は、レンダラーとメインプロセスの code をパッケージ化してデスクトップアプリにします。もしビルド時にエンドポイントやフィーチャーフラグが解決されてしまうと、その値はアーティファクトと共に固定されます。後から変更するには、通常、新しい bundle を作成し、再度署名を行い、適切なチャネルを通じて配布し直す必要があります。

ドリフトは無害な例外から始まる

設定のドリフト(乖離)は、以下のような「合理的なショートカット」から発生します:

  • ローカルでのオーバーライド: 開発者が機能をテストするためにエンドポイントをハードコードし、そのまま消し忘れる。
  • 個別のパイプライン変数: CI が、リポジトリに記載された設定と一致しない本番用の値を使用している。
  • ネイティブ固有の設定: Android、iOS、Electron で、プラグインの識別子やコールバック設定が異なっている。
  • ドキュメント化されていないフラグ: 運用チームがデプロイシステム上で直接フィーチャーフラグを変更する一方で、ステージング環境では古い挙動が維持されるといった状況です。

それぞれの選択肢は単体では機能します。問題は、どの値が正解なのか、どの環境がその値を管理しているのか、そして最後にいつ変更されたのかを誰も答えられなくなった時に始まります。

実践ルール: 設定値がアプリケーションのロジックとは独立して変更可能な場合は、ソース code ではなく、デプロイ時の入力値として扱うべきです。

ステージング環境は、エンドポイントや認証情報、データを分離しつつも、統合時の問題をあぶり出せるよう本番環境に極めて近い状態であるべきです。環境に乖離(ドリフト)が生じると、ステージングは有用なリハーサルではなくなります。ある前提条件に基づいたテストをすべてパスしたリリースが、別の前提条件の下ですぐに失敗することもあり得るのです。

ビルド時の設定がリリースのボトルネックになる

ビルド時の設定も依然として有用です。公開用のコンパイル時定数、プラットフォーム固有の識別子、ネイティブツールが必要とする設定などは、アプリのパッケージング前に存在する必要があります。問題は、リリース後に運用チームが変更する必要がある値に対して、ビルド時のインジェクションを使用してしまうことです。

本番環境の API が新しいエンドポイントに移動する場合を想定してください。従来の Capacitor ワークフローでは、チームは値を変更し、Webアセットをビルドし、ネイティブプロジェクトを同期し、アプリに署名を行い、プラットフォームのリリースプロセスを通じて配布する必要があります。Electronのチームも、変更したい値がパッケージ化されたアプリの内部にある場合、同様のサイクルに直面します。

そのワークフローは、計画的な製品リリースには適しています。しかし、緊急の構成修正への対応としては不十分です。バイナリもJavaScriptも変更されていないのに、たった一つの文字列の修正だけで、完全なデリバリーサイクルを強いることになるからです。

より安全な設計では、以下の3つのレイヤーを分離します:

  1. アプリケーションロジックこれは、環境間で同一であるべきものです。
  2. 環境設定エンドポイントやフラグ、機密性のない実行時の挙動を選択します。
  3. シークレット情報これは管理されたストレージに保管し、必要な時にのみ注入すべきものです。

この分離により、設定の乖離(drift)が可視化されます。また、本番環境で予期せぬ挙動が発生した際、code のせいにしたりする前に、設定値の入力を比較するという明確な解決策をチームに提供できます。

4つの主要な設定パターンの比較

ハイブリッドアプリケーションのあらゆる部分に適合する、単一の構成パターンは存在しません。バックエンドは起動時にプロセス環境変数を読み込めますが、Capacitor レンダラーには従来のサーバープロセスが存在しない場合があります。Electronでは、メインプロセスとレンダラーの間にさらなる境界が生じます。適切な選択は、その値が公開情報か、機密情報か、リリース後に変更可能か、あるいは Native Build ツールによって必要とされるものかによって決まります。

パターン1:12-Factor 環境変数

12-Factorモデルでは、設定をアプリケーション内にハードコードされた状態ではなく、環境固有の入力として扱います。これはサーバープロセスやコンテナ、CIジョブにおいて自然な手法です。サービスは起動時に値を読み込むことで、同じアーティファクトを複数のデプロイメントで使い回すことができます。

クライアントサイドのアプリでは、このモデルは複雑になります。ブラウザのJavaScriptが参照する値は、最終的にクライアントに渡される必要があるため、単に環境変数経由で渡されたからといって秘密情報として扱うべきではありません。公開されるAPIのオリジンやフィーチャーフラグにはビルド時の置換が使えますが、権限を持つ認証情報は、リバース可能なクライアント用bundleに含めてはいけません。

CapacitorやElectronにおいて、このパターンは以下の場合に最適です: ビルドのオーケストレーションと公開設定。機密情報の保護には向きません。概念的なオーバーヘッドは低いですが、別の配信レイヤーがない限り、実行時の変更性は限定的です。

パターン2:環境ごとのビルド

開発、ステージング、本番用のビルドプロファイルを用意するチームは多いです。各プロファイルは、独自のエンドポイント、アプリ識別子、Native Build用のサービスファイル、フィーチャーフラグを選択します。このアプローチは説明が容易で、プラットフォームの要件にも適合します。

弱点はアーティファクトの乖離です。条件付きコンパイルやプラットフォーム固有のスクリプトがpipelineに混入すると、設定だけでなく挙動そのものが3つのビルド間で異なる可能性があります。設定変更のたびに新しいビルドが必要となり、署名、notarization、ストアの審査、あるいは手動のリリース調整が発生してしまいます。

ロールバックもアーティファクトの配布に依存します。古いバイナリに戻すことは可能ですが、ユーザーにはすでに異なるバージョンがインストールされている可能性があり、ロールバックの手順は配布チャネルによって異なります。

パターン3:ランタイム構成

ランタイム構成では、変更可能な値をネイティブアーティファクトの外に切り出します。アプリは起動時に構成ドキュメントを取得するか、事前に配信されたローカルキャッシュを読み込みます。これにより、アプリケーションの code を変更することなく、エンドポイントやフラグを修正できます。

トレードオフは、起動時に新たな依存関係が生じることです。リモートの構成サービスが利用できない場合に備え、安全なキャッシュ、タイムアウト制限、および明確なフォールバックポリシーが必要です。フォールバック先が誤った環境を指さないように注意してください。ドキュメントのスキーマを検証し、必要に応じてソースを認証し、アプリがどの構成バージョンを適用したかを記録しましょう。

ハイブリッドアプリにおいて、機密情報以外の値に対してはこれが最も柔軟なパターンです。ただし、モバイルユーザーはネットワーク接続がない状態でアプリを起動する場合があるため、オフライン時の挙動を慎重に設計する必要があります。

パターン4:専用のシークレット管理

HashiCorp VaultやAWS Secrets Managerなどのプラットフォームは、機密性の高いバックエンド情報の管理に特化しています。これらはアクセス制御、監査ログ、暗号化、ローテーションのワークフローをサポートしており、ユーザーに認証情報を公開することなく、シークレットストアに認証できるサーバーサイドサービスに適しています。

しかし、これらはクライアント側のシークレット問題までは解決できません。モバイルやデスクトップのクライアントに渡されたシークレットは、通常、デバイスの所有者によって解析される可能性があります。クライアントアプリケーションには公開しても安全な値のみを渡し、権限が必要な操作はバックエンド側に残すべきです。

パターン ビルドの複雑さ ストアへの再申請が必要 ロールバックの速度 最適な用途
12-Factor変数 サーバーは低、ハイブリッドビルドは中程度 通常、バンドルされたクライアント値用 中 バックエンドサービスおよび公開ビルド入力
環境ごとのビルド 環境が増えるほど高くなる はい、bundleの値が変わる場合 低速〜中速 リリース頻度の低い小規模チーム
ランタイム構成 中 互換性のあるWebレイヤー変更なら不要 高速(バージョン管理されたペイロード) 変更可能なエンドポイント、フラグ、クライアント挙動
シークレット管理プラットフォーム 中〜高 バックエンド専用のシークレットには不向き サーバー側での利用に最適 権限を持つバックエンドの認証情報

リリース頻度が低い単一アプリの開発チームであれば、環境ごとのビルドと厳格なバリデーションから始めることができます。ステージングと本番環境を並行して運用する成長中のチームには、アーティファクトの乖離を抑えるためのランタイムレイヤーが必要です。さらに高頻度なリリースを行うチームは、不変のアプリケーション bundle、ランタイム構成、そしてバックエンド認証情報用のシークレットマネージャーを組み合わせるべきです。 Capacitor のための機能フラグ実装ガイド フラグがスコープ化され、監査可能で、クライアントに公開しても安全であれば、このランタイムレイヤーの一部として機能します。

無視できないセキュリティと CI/CD への影響

CI から取得したからといって、設定値が自動的に安全になるわけではありません。値がクライアント bundle、ネイティブリソース、Electron アーカイブ、ログファイル、クラッシュレポート、またはデバイスのバックアップに含まれた瞬間、そのアーティファクトにアクセスできる誰かが中身を検査できる可能性があると考えてください。

公開識別子やクライアント側の設定は、シークレットとは異なります。アプリケーションを識別するためだけのモバイル API キーであれば、プロバイダーがその存在を想定し、使用範囲を制限している場合に限り、bundle 内に含まれていても許容される場合があります。しかし、データベースの認証情報、署名用のシークレット、権限を持つトークン、または制限のないサービス認証情報を同じ場所に置くのは危険です。OWASP SAMM では、職務の分離や本番環境シークレットの暗号化、保護されていないシークレットのリポジトリ混入防止、そしてインシデントを待つのではなくライフサイクルを管理することを推奨しています。

CI/CDおよびデプロイメントパイプラインにおける、ハードコードされたシークレットに起因する3段階のセキュリティリスクを示す図。

パイプラインから設定情報が漏洩する箇所

CI/CDシステムは、日常的なミスで失敗します。シェルコマンドが展開された変数を表示したり、ビルド失敗時の例外にシークレットが含まれたり、デバッグ工程で環境ダンプがアーカイブされたりすることがあります。 .env.production また、リポジトリが不完全な状態を継承したことで、ファイルがバージョン管理に混入する可能性もあります。 .gitignore.

機密性の高い値にはセキュアなストアを使用し、パイプラインの権限は最小限に抑えてください。ビルドジョブには対象に必要な値のみを渡し、ログではそれらをマスクすべきです。生成されたJavaScript、ネイティブリソース、Electronアーカイブ、ソースマップに、誤って含まれていないか確認してください。リモート配信される設定ペイロードにチェックサムや署名を付与することで改ざん検知には役立ちますが、クライアント側から見える値をシークレットに変えることはできません。

分析データやその他の機密データを扱うチームは、ELECTEのような別のリソースを活用できます。 AI分析向けのセキュリティホワイトペーパー より広範なデータ保護の責任を検討する際に役立ちます。これは、アプリケーション固有の設定制御を置き換えるものではなく、それを補完するものです。

セキュリティはリリース速度と両立させる必要があります

本番環境のシークレットを安全に扱うには、管理されたストレージ、転送中および保存時の暗号化、最小権限アクセス、そしてローテーションが不可欠です。一方で、変更可能なパブリックエンドポイントの場合は、異なる安全なパターンが求められます。エンドポイントはバージョン管理されたランタイムドキュメントを通じて配信し、使用前に検証を行い、不正な値が入力された場合にはアクセスを遮断(fail closed)するように制限すべきです。

バックエンドへの通信を避けるために、Capacitor や Electron の code に特権的な認証情報を入れないでください。難読化やコードの圧縮、あるいはレンダラー内の隠し変数に頼ることも避けてください。これらの手法は、簡易的な調査を困難にはしますが、クライアントデバイスの信頼モデルそのものを変えるものではありません。

実用的なパイプラインでは、以下のように責務を分離します:

  • ソース管理: 設定スキーマや安全なサンプルをコミットしてください。実際のシークレットは決してコミットしないでください。
  • ビルドステージ: アーティファクトの生成に必要な値のみを注入し、ログ内でシークレットが展開されないように制御します。
  • デリバリーステージ: 認証済みで Observe 可能なチャネルを通じて、環境固有のランタイムバンドルを適用します。
  • ローテーションステージ: 定義されたスケジュールに従ってバックエンドの認証情報を失効・更新します。また、インシデント発生時に即座に無効化できるフローも用意しておきます。

この Capacitor チームのための CI/CD シークレット管理の実践法 明示的なインベントリと組み合わせることで真価を発揮します。各変数について、公開か機密か、所有者は誰か、どの環境で使用するか、変更時に Native Build が必要かをドキュメント化してください。

Capacitor と Electron での環境設定の実装

保守性の高いセットアップは、フレームワーク固有の条件分岐の山ではなく、単一の設定コントラクトから始まります。安全な環境入力は予測可能なファイルに保持し、ビルドシステム経由でロードし、型定義された小さなサービスを通じてアプリケーションの code に公開します。

実用的なリポジトリ構成は以下の通りです:

.env
.env.staging
.env.production
.env.example
src/config/
  schema.ts
  config-service.ts
capacitor.config.ts
electron/
  main.ts
  preload.ts

のみが .env.example ソース管理に含まれます。その他のファイルは無視(ignore)すべきであり、CI が各ターゲットの値を供給するようにします。ファイルには公開エンドポイントやフィーチャーフラグを含めることができますが、機密性の高いバックエンドの認証情報は専用のシークレットストアに保持し、クライアントの bundle に含めてはいけません。

単一のコントラクトを定義・検証する

Vite では、クライアントに公開される変数は通常 VITE_ 接頭辞を使用します。この接頭辞は可視性のシグナルであり、セキュリティ境界ではありません。

// src/config/schema.ts
export type AppConfig = {
  apiBaseUrl: string
  enableNewCheckout: boolean
  environment: 'development' | 'staging' | 'production'
}

function required(name: string, value: string | undefined): string {
  if (!value) {
    throw new Error(`Missing required configuration: ${name}`)
  }
  return value
}

export function loadConfig(): AppConfig {
  const environment = required('VITE_APP_ENV', import.meta.env.VITE_APP_ENV)

  if (!['development', 'staging', 'production'].includes(environment)) {
    throw new Error(`Unsupported environment: ${environment}`)
  }

  return {
    apiBaseUrl: required('VITE_API_BASE_URL', import.meta.env.VITE_API_BASE_URL),
    enableNewCheckout: import.meta.env.VITE_ENABLE_NEW_CHECKOUT === 'true',
    environment: environment as AppConfig['environment'],
  }
}

呼び出す loadConfig() アプリケーションの起動時に行います。値が欠落している場合は、ローカルのエンドポイントを選択するのではなく、明確なエラーを出すようにすべきです。この判断一つで、本番環境でのルーティングミスという大量のバグを防ぐことができます。

ローカル開発では、Viteのmode機能を使って適切なファイルを切り替えられます。stagingビルドでは .env.stagingを使用し、productionビルドでは .env.productionを使用します。CIジョブでは、開発者のローカル環境の設定を引き継ぐのではなく、modeを明示的に指定すべきです。

Capacitor ネイティブ設定

ネイティブプロジェクトでは、環境ごとに異なる識別子、サービスファイル、プラグイン設定が必要になることがよくあります。これらの値は capacitor.config.tsに保持しますが、機密性の高い認証情報をそこに含めるのは避けましょう。

// capacitor.config.ts
import type { CapacitorConfig } from '@capacitor/cli'

const isProduction = process.env.APP_ENV === 'production'

const config: CapacitorConfig = {
  appId: isProduction ? 'com.example.app' : 'com.example.app.staging',
  appName: isProduction ? 'Example' : 'Example Staging',
  webDir: 'dist',
  plugins: {
    PushNotifications: {
      presentationOptions: ['badge', 'sound', 'alert'],
    },
  },
}

export default config

Firebaseのファイル、プッシュ通知の証明書、プラットフォーム識別子などは、Native Buildのパイプラインで選択し、適切なアクセス制御のもとで管理する必要があります。productionアプリでは、stagingの認証情報を再利用してはいけません。両方のビルドはコンパイルプロセスを経て生成されるためです。

この Capacitor ローカル環境構築ガイド を活用することで、チーム内でのローカルmodeの標準化が可能になりますが、リポジトリには依然として明示的な規約とCIによる検証が必要です。

Electronにはプロセス境界が必要です

Electronのレンダラープロセスは、Node.jsのメインプロセスとは異なります。セキュリティを強化したアプリケーションでは、 process.env メインプロセスでは利用可能でも、レンダラーでは undefined または意図的に利用不可となっている場合があります。安全な設定のみを preload ブリッジ経由で渡してください。

// electron/main.ts
import { app, BrowserWindow } from 'electron'
import path from 'node:path'

function createWindow() {
  const window = new BrowserWindow({
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      contextIsolation: true,
      nodeIntegration: false,
    },
  })

  const safeConfig = {
    apiBaseUrl: process.env.API_BASE_URL,
    environment: process.env.APP_ENV,
  }

  window.webContents.on('did-finish-load', () => {
    window.webContents.send('app-config', safeConfig)
  })

  return window
}

app.whenReady().then(createWindow)
// electron/preload.ts
import { contextBridge, ipcRenderer } from 'electron'

contextBridge.exposeInMainWorld('appConfig', {
  get: () => new Promise((resolve) => {
    ipcRenderer.once('app-config', (_event, config) => resolve(config))
  }),
})

レンダラー側でもう一度オブジェクトを検証してください。ブリッジは公開された実行時の値のみを公開すべきであり、シークレットストアのトークンや特権的なファイルシステム機能などは決して渡すべきではありません。

項目 Capacitor Electron
メイン設定の境界 ネイティブプロジェクトとバンドルされたWebアセット メインプロセス、preload、レンダラー
安全なクライアント値 公開エンドポイントとフラグ preload経由で渡される公開エンドポイントとフラグ
機密性の高い認証情報 アプリのbundleには含めない パッケージ化されたアーカイブには含めない
よくある失敗例 native sync後のビルド値の不整合 process.env レンダラーで利用不可
ランタイムのアップデートパス 署名済みweb bundleまたはリモートconfig 署名済みweb bundleまたは制御されたアプリアップデート

最も多い実装ミスは、次のように思い込むことです: .env ファイルは自動的に非公開になると。bundlerが生成されたJavaScriptに値を含めたり、パッケージング工程でファイル自体が含まれたりすることがあります。ソースツリーだけでなく、最終的なアーティファクトを検証してください。

Capgoによるターゲットアップデートとロールバックの簡素化

厳格なビルド時の設定を行っていても、運用上の課題が残ります。リリース後に公開エンドポイントが変更された場合、ネイティブアプリには古い値が残ったままになる可能性があります。変更が必要な箇所がwebレイヤーのみである場合、バイナリを再ビルドして配布するのは過剰なコストです。

Capgo の live-update モデルは、以下の仕組みでその課題を解決します: ターゲットを絞ったチャンネル これにより、開発、ステージング、本番といったデプロイ環境ごとに管理が可能になります。チームは、対象となる環境に合わせたチャンネルへ、署名済みの JavaScript、CSS、設定ファイル、またはアセットの bundle を公開できます。ネイティブシェルはそのまま維持され、アプリは次回の起動時に互換性のあるアップデートを適用します。

従来のアプリ設定ワークフローと、Capgo プラットフォームを使用したインスタントアップデートおよびロールバックの比較チャート。

本番環境の API エンドポイントが予期せず変更されたケースを考えてみましょう。チームは、ネイティブストアのリリースを待つ代わりに、設定ソースを更新して web bundle をビルドし、本番用チャンネルに公開できます。重要な境界線は守られています。この手法は、ネイティブ code に関するプラットフォームのルールを回避するものではなく、また機密情報を安全に配布するためのものでもありません。あくまで、互換性のある web レイヤーの設定修正に必要な時間を短縮するためのものです。

チャンネルによって環境の所有権が明確になります

チャンネルは個々の開発者の好みではなく、環境に紐付けるべきです。開発テスターには開発用コンテンツが、ステージングユーザーにはステージング用コンテンツが、そして本番ユーザーには本番用に承認された bundle のみが配信されます。CI は、対応するビルドと検証ステップの後に、適切な bundle を公開できます。

ロールバックも同様に重要です。新しい設定が正常に動作しないサービスを指している場合、リリース担当者はそのチャンネルの以前の正常なbundleを即座に選択できる必要があります。バージョン履歴、デプロイのガードレール、デバイスレベルのレポートを活用することで、問題が広範囲に及んでいるのか、あるいは特定のロールアウトセグメントに限定されているのかをチームが判断できるようになります。

これにより、より明確なプロモーションパスが実現します:

  1. 開発用にbundleをビルドして検証する。
  2. テスト済みの同じコンテンツをstagingへ昇格させる。
  3. productionチャンネルのアップデートを承認する。
  4. 採用状況とエラーを監視する。
  5. 設定に問題がある場合はチャンネルを元に戻す。

このプロセスにより、エンドポイントの修正のたびに緊急のNative Buildを作成しなければならないという状況を回避できます。 Capgo のバージョン管理とロールバックのワークフローは、 追跡可能な履歴を保持しつつ、環境ごとに異なるリリースを行う必要があるチームにとって特に重要です。

環境設定の監査チェックリスト

主要なリリース前や、pipelineの変更後には必ずこの監査を実行してください。

  • アーティファクトの検査: コミットされたファイル、生成されたJavaScript、ネイティブリソース、source map、またはElectronアーカイブに機密情報が含まれていないことを確認します。
  • 環境の分離: 開発、ステージング、本番環境が、それぞれ異なるエンドポイント、識別子、および承認済みのキーを使用していることを確認します。
  • 入力の保護: すべての .env バリアントが無視され、同時に .env.example 必要なスキーマがドキュメント化されているか確認します。
  • CIのレビュー: パイプラインが開発者のローカルマシンに依存せず、管理されたストアから値を注入していることを確認します。
  • リカバリのテスト: 必須の値が欠落している場合にランタイム設定が即座に失敗すること、およびNative Buildを再構築せずに互換性のあるアップデートをロールバックできることを確認します。

「環境設定監査チェックリスト」と題されたインフォグラフィック。安全なソフトウェアデプロイメントを実現するための5つのステップを紹介しています。

すべての本番環境の設定値について、所有者、ソース、スコープ、およびロールバック手順を特定できる状態になって初めて、監査は完了したと言えます。


Capgo は、CapacitorJS および Electron アプリ向けに署名済みの Live Update を提供します。ターゲットを指定できるチャンネル機能や、互換性のある JavaScript、CSS、設定、アセットの変更に対するバージョン管理されたロールバック機能を備えています。環境更新の制御を維持しつつ、再ビルドのサイクルを減らしたいチームは、以下をご覧ください。 Capgo 既存の CI/CD プロセスと併せて検討してください。

Capacitor アプリ向けの Live Update

Webレイヤーのバグが本番に出たときは、アプリストアの審査を何日も待たずに Capgo で修正を配信できます。ネイティブの変更は通常の審査フローに乗せたまま、ユーザーにはバックグラウンドでアップデートが届きます。

最新のブログ記事

Capgo は、本格的なプロフェッショナルモバイルアプリの開発に必要な最高のインサイトを提供します。