メインコンテンツにジャンプ
CI/CD

Automatic Capacitor IOS build with GitHub actions using match

5分でIOS IonicアプリのCI/CDパイプラインを設定する方法:fastlaneとGitHub Actions

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

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

コンテンツマーケター

Automatic Capacitor IOS build with GitHub actions using match

マッチを使用したGitHub Actionsによる自動iOSビルド

Setting up CI/CD for Capacitor apps can be complex and time-consuming. Here’s what you need to know:

今後は__CAPGO_KEEP_0__ ビルドを使用することをおすすめします。 Capgo Capgo CLI Capacitor このFastlane Matchガイドは、既存のGitHub Actionsパイプラインを維持しているチーム向けに残されていますが、新しいiOSビルドにはCapgo CLIを使用してください。そうすると、Fastlane、Matchリポジトリ、Xcodeランナー、証明書、アップロードスクリプトを自分で維持する必要がなくなります。

Capgo Capgo

Fastlane Match、Xcodeランナー、証明書、プロビジョニングプロファイル、アップロードスクリプトの維持をスキップしてください。 Capgo __CAPGO_KEEP_0__ Buildは、既存のCI/CDパイプラインから実行される署名済みネイティブiOSビルドです:

  • __CAPGO_KEEP_0__ Buildは、ワークフローと一緒に機能します。: Capgo BuildをGitHub Actions、GitLab CI、Jenkins、またはローカルスクリプトからトリガーしてください。ウェブビルド後に npx cap sync.
  • __CAPGO_KEEP_0__ Buildから署名する: App Store Connectのキー、証明書、プロビジョニングプロファイル、パスワード、チームIDをCIシークレットに保持してください。
  • ネイティブランナーの維持をせずに済みます: Capgo Build は、macOS ランナーの管理、Xcode イメージ、Fastlane、または Match リポジトリの管理を必要とせずに、維持された Apple ビルド環境を提供します。
  • Artifacts and submission: Capgo CLI を使用して、QA のために署名されたアーティファクトをダウンロードしたり、リリースビルドを提出したりできます。

Pricing

  • Capgo plans start at $12/month
  • __CAPGO_KEEP_0__ プランでは、OTA の更新と約 15 のネイティブ ビルドが含まれます。
  • __CAPGO_KEEP_0__ のプランでは、追加のビルド分数はクレジットを通じて 1 分あたり請求されます。

Set up Capgo Build in CI/CD

Manual Setup Guide

ここで、以下の手順を実行してください。

Continuous Delivery for iOS using Fastlane and GitHub Actions using match

Prerequisites

チュートリアルを続ける前に…

  • Fastlaneがインストールされていることを確認してください 開発マシンに iOS開発者プログラムの会員資格
  • 読みたい😆…
  • 多くの開発者がいるチームの場合、よりシンプルなワークフローを実現するために
  • fastlane certを使用することをお勧めします 価格についての重要な点 価格 {0} Action

https://{0}.com/features/actions

Price GitHub Action

https://github.com/features/actions

料金は、選択したマシンに応じて、一定の制限まで無料です。
この記事では、 macOS マシンを使用します。スクリーンショットでは、その価格と制限を確認できます (このチュートリアルの作成時点での価格です。将来の変更が可能です)

🔴 要件と価格について注意した後、続きますか?

📣 この記事では、iTunes Connectでアプリを作成し、Appleのエコシステムの証明書を所有していることを前提としています。Fastlaneがすべてをコピーします!

始めましょう!

この記事で説明する手順

  1. App Store Connect APIを使用してFastlane Match
  2. 要件
  3. App Store Connect API キーを作成する
  4. App Store Connect API キーを使用する
  5. ファイルをコピー
  6. Fastlane matchを設定

1. App Store Connect APIとFastlane Matchを使用

2021年2月以降、すべてのユーザーがApp Store Connectにサインインするには、2要素認証または2段階認証が必要になります。Apple IDの追加セキュリティ層により、自分のアカウントにアクセスできるのはあなただけになります。
From Apple Support

matchを始めるには、既存の証明書を取り消す必要があります。心配はいりません、新しい証明書がすぐに手に入ります。

要件

App Store Connect APIを使用するには、Fastlaneには 3 ものが必要です。

  1. 発行者ID
  2. __CAPGO_KEEP_0__ ID.
  3. __CAPGO_KEEP_0__ ファイルまたは __CAPGO_KEEP_0__ 内容。

App Store Connect API キーの作成

App Store Connect の __CAPGO_KEEP_0__ キーを生成するには、Admin の権限が必要です。権限がない場合は、この記事を参照し、以下の手順に従ってください。

1 — App Store Connect にログインします。 App Store Connect.

2 — "ユーザーとアクセス" を選択します。 App Store Connect ユーザー アクセス.

3 — "統合" タブを選択します。

App Store Connect __CAPGO_KEEP_0__ 統合

4 — "API キーを生成" または "+" ボタンをクリックします。

API

App Store Connect API keys create

5 — __CAPGO_KEEP_0__ の名前を入力してください。名前はあなた自身の記録用であり、__CAPGO_KEEP_0__ の一部ではありません。

App Store Connect API keys create name

6 — アクセスセクションで、__CAPGO_KEEP_0__ のロールを選択してください。__CAPGO_KEEP_0__ のロールは、チームのユーザーに適用されるロールと同じです。詳しくは ロールの権限を参照してください。 App Store Connect でおすすめのロールは.

App manager

An API key’s access cannot be limited to specific apps.

__CAPGO_KEEP_0__ のアクセスは特定のアプリに制限できません。

ページ上に、__CAPGO_KEEP_0__ の名前、__CAPGO_KEEP_0__ ID、ダウンロードリンク、他に情報が表示されます。

App Store Connect で __CAPGO_KEEP_0__ をダウンロードするにはこちらから情報を取得できます。
1. 問題 ID.
2. キー ID.
<3> Click “Download API Key” to download your API private key. The download link appears only if the private key has not yet been downloaded. Apple does not keep a copy of the private key. So, you can download it only once.

🔴 プライベート キーを安全な場所に保存してください。キーを共有しないでください、キーを code リポジトリに保存しないでください、またはクライアント側の code に含めないでください。

App Store Connect API キーを使用する

API キー ファイル(ダウンロードした p8 ファイル)、キー ID、発行者 IDが必要です。これらの情報を Fastlane に入力する方法は複数あります。 app_store_connect_api_keyFastlane ドキュメント Fastlane のドキュメントを参照してください。Fastlane を App Store Connect __CAPGO_KEEP_0__ キーで管理できるようになりました!

Now we can manage Fastlane with the App Store Connect API key, great!

Fastlane は、Android Studio を使用してモバイル開発タスクを自動化するための Ruby ライブラリです。Fastlane を使用すると、カスタムの「レーン」を構成できます。これらのレーンには、通常の Android Studio を使用して実行するタスクを実行する「アクション」が含まれます。Fastlane を使用すると、多くのタスクを実行できますが、このチュートリアルの目的では、主なアクションのみを使用します。

Fastlane は、Android Studio を使用してモバイル開発タスクを自動化するための Ruby ライブラリです。Fastlane を使用すると、カスタムの「レーン」を構成できます。これらのレーンには、通常の Android Studio を使用して実行するタスクを実行する「アクション」が含まれます。Fastlane を使用すると、多くのタスクを実行できますが、このチュートリアルの目的では、主なアクションのみを使用します。

プロジェクトのルートにFastlaneフォルダを作成し、以下のファイルをコピーしてください: Fastfile

default_platform(:ios)

DEVELOPER_APP_IDENTIFIER = ENV["DEVELOPER_APP_IDENTIFIER"]
DEVELOPER_APP_ID = ENV["DEVELOPER_APP_ID"]
PROVISIONING_PROFILE_SPECIFIER = ENV["PROVISIONING_PROFILE_SPECIFIER"]
TEMP_KEYCHAIN_USER = ENV["TEMP_KEYCHAIN_USER"]
TEMP_KEYCHAIN_PASSWORD = ENV["TEMP_KEYCHAIN_PASSWORD"]
APPLE_ISSUER_ID = ENV["APPLE_ISSUER_ID"]
APPLE_KEY_ID = ENV["APPLE_KEY_ID"]
APPLE_KEY_CONTENT = ENV["APPLE_KEY_CONTENT"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]

def delete_temp_keychain(name)
  delete_keychain(
    name: name
  ) if File.exist? File.expand_path("~/Library/Keychains/#{name}-db")
end

def create_temp_keychain(name, password)
  create_keychain(
    name: name,
    password: password,
    unlock: false,
    timeout: 0
  )
end

def ensure_temp_keychain(name, password)
  delete_temp_keychain(name)
  create_temp_keychain(name, password)
end

platform :ios do
  lane :build do
    build_app(
      configuration: "Release",
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      export_method: "app-store",
      export_options: {
        provisioningProfiles: { 
            DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
        }
      }
    )
  end
  lane :refresh_profiles do
    match(
      type: "development",
      force: true)
    match(
      type: "adhoc",
      force: true)
  end
  desc "Register new device"
  lane :register_new_device do  |options|
      device_name = prompt(text: "Enter the device name: ")
      device_udid = prompt(text: "Enter the device UDID: ")
      device_hash = {}
      device_hash[device_name] = device_udid
      register_devices(
                       devices: device_hash
                       )
    refresh_profiles
  end
  lane :closed_beta do
    keychain_name = TEMP_KEYCHAIN_USER
    keychain_password = TEMP_KEYCHAIN_PASSWORD
    ensure_temp_keychain(keychain_name, keychain_password)

    api_key = app_store_connect_api_key(
      key_id: APPLE_KEY_ID,
      issuer_id: APPLE_ISSUER_ID,
      key_content: APPLE_KEY_CONTENT,            
      duration: 1200,            
      in_house: false
    )

    match(
      type: 'appstore',
      git_basic_authorization: Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"),
      readonly: true,
      keychain_name: keychain_name,
      keychain_password: keychain_password,
      api_key: api_key
    )

    gym(
      configuration: "Release",
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      export_method: "app-store",
      export_options: {
        provisioningProfiles: { 
            DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
        }
      }
    )

    pilot(
      apple_id: "#{DEVELOPER_APP_ID}",
      app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
      skip_waiting_for_build_processing: true,
      skip_submission: true,
      distribute_external: false,
      notify_external_testers: false,
      ipa: "./App.ipa"
    )

    delete_temp_keychain(keychain_name)
  end
  lane :submit_review do
    version = ''
    Dir.chdir("..") do
      file = File.read("package.json")
      data = JSON.parse(file)
      version = data["version"]
    end
    deliver(
      app_version: version,
      submit_for_review: true,
      automatic_release: true,
      force: true, # Skip HTMl report verification
      skip_metadata: false,
      skip_screenshots: false,
      skip_binary_upload: true
    )
  end
end

Appfile

app_identifier(ENV["DEVELOPER_APP_IDENTIFIER"])
apple_id(ENV["FASTLANE_APPLE_ID"])
itc_team_id(ENV["APP_STORE_CONNECT_TEAM_ID"])
team_id(ENV["DEVELOPER_PORTAL_TEAM_ID"])

Fastlane matchを設定

Fastlane match iOSのcode署名の新しいアプローチです。Fastlane matchは、iOSアプリの必要な証明書とプロビジョニングプロファイルを管理するチームに簡単にできるようにします。

新しいプライベートリポジトリを作成し、 certificates例えば、GitHubの個人アカウントまたは組織で

iOSアプリのFastlane matchを初期化します。

fastlane match init

次に、オプション#1(Git Storage)を選択します。

[01:00:00]: fastlane match supports multiple storage modes, please select the one you want to use:1. git2. google_cloud3. s3?

新しく作成したリポジトリのURLを割り当てます。

[01:00:00]: Please create a new, private git repository to store the certificates and profiles there[01:00:00]: URL of the Git Repo: <YOUR_CERTIFICATES_REPO_URL>

Fastlaneフォルダ内にファイル名が Matchfile_git_url_httpsの証明書リポジトリのURLに設定する必要があります。オプションでSSHを使用することもできますが、別のステップで実行する必要があります。

# ios/Matchfilegit_url("https://github.com/gitusername/certificates")storage_mode("git")type("appstore")

次に、Fastlane Matchで証明書を生成し、パスフレーズを入力するときにクレデンシャルを入力します。

パスフレーズを正しく覚えておいてください。GitHub Actionsが後で証明書リポジトリを暗号化するために使用します。

fastlane match appstore

すべてがうまくいった場合、以下のような画面が表示されます。

[01:40:52]: All required keys, certificates and provisioning profiles are installed 🙌

問題が発生した場合は、GitHubと必要な権限に関するこの 投稿 gitの認証トークンを生成するのに役立ちます。

生成された証明書とプロビジョニングプロファイルは、証明書リポジトリのリソースにアップロードされます。

App Store Connect証明書

最後に、 project Xcodeで、リリース構成のアプリのプロビジョニングプロファイルを更新してください。

XCode証明書

注意点が数点あります 💡

MATCH

CI/CDが証明書とプロビジョニングプロファイルをインポートするには、証明書リポジトリにアクセスする必要があります。 これを行うには、プライベートリポジトリにアクセスまたは読み取り可能なスコープを持つパーソナルアクセストークンを生成する必要があります。

GitHubに移動してください 設定開発者設定パーソナルアクセストークン → クリック Generate New Token → スコープにチェックを入れてからクリック repoGenerate token.

パーソナル アクセス トークンを作成する

パーソナル アクセス トークンのコピーを用意する GIT_TOKEN.

次に、Fastlane フォルダ内で生成されたマッチ ファイルを置き換える マッチファイル

CERTIFICATE_STORE_URL = ENV["CERTIFICATE_STORE_URL"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]
FASTLANE_APPLE_ID = ENV["FASTLANE_APPLE_ID"]

git_url(CERTIFICATE_STORE_URL)
storage_mode("git")
type("appstore")
git_basic_authorization(Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"))
username(FASTLANE_APPLE_ID)

このファイルは、GitHub Actionsによって証明書とプロビジョニング プロファイルをインポートし、GitHub Secretsで変数を設定するのと同じです。ファイルにハードコードするのではなく。

ビルド処理

GitHub Actionsで 実行時間に基づいて課金されます。 CI/CD ワークフローを実行するのにかかる分数に基づいて課金されます。App Store Connectでビルドを処理するのに約10-15分かかります。

プライベート プロジェクトの場合、ビルドあたりの推定コストは 0.08$/分 x 15分 = $1.2, or more, depending on the configuration or dependencies of your project.

または、プロジェクトの構成や依存関係に応じて、より高くなる可能性があります。 skip_waiting_for_build_processingtrue.

アプリをApp Store Connectにアップロードするには、ビルドが処理された後、手動でアプリの適合性を更新する必要があります。

このオプションは、ビルド時間を節約したい場合はオプションです。プライベートプロジェクトの場合、ビルド時間を節約したい場合はオプションです。フリープロジェクトの場合は、問題ありません。詳しくは 価格.

3. GitHub Actionsの設定

GitHub シークレットの設定

プロジェクトのシークレットから値がどのように取得されるのか、気になっていましたか? それはもう秘密ではありません – それはプロジェクトのシークレットからです。 ENV __CAPGO_KEEP_0__ シークレットの設定

Set GitHub secrets

1. APP_STORE_CONNECT_TEAM_ID - App Store Connectでアプリを選択し、

2. DEVELOPER_APP_ID アプリ情報 - App Store ConnectのチームID → アプリのセクションにスクロールし、 General Information アプリのバンドル識別子を探してください。 Apple ID.

3. DEVELOPER_APP_IDENTIFIER 開発者ポータルチームのIDを探してください。複数のチームに所属している場合。

4. DEVELOPER_PORTAL_TEAM_ID アプリを管理するために使用するApple IDまたは開発者メールアドレスを探してください。

5. FASTLANE_APPLE_ID

6. GIT_USERNAME Gitユーザー名とパーソナルアクセストークンを探してください。 GIT_TOKEN matchを初期化したときに割り当てたパスフレーズが、証明書とプロビジョニングプロファイルを暗号化するために使用されます。

7. MATCH_PASSWORD , 例えば。

8. PROVISIONING_PROFILE_SPECIFIER - match AppStore <YOUR_APP_BUNDLE_IDENTIFIER>match AppStore com.domain.blabla.demo.

9. TEMP_KEYCHAIN_USER ワークフロー用に一時的なキーチェーンユーザーとパスワードを割り当てることができます。 TEMP_KEYCHAIN_PASSWORD アプリストア接続__CAPGO_KEEP_0__キー 🔺キーID。

10. APPLE_KEY_ID — App Store Connect API Key 🔺Key ID.

11. APPLE_ISSUER_ID — App Store Connect API キー 🔺発行者ID。

12. APPLE_KEY_CONTENT — App Store Connect API キー 🔺 キーファイルまたはキー内容 .p8, 確認してみてください。

13. CERTIFICATE_STORE_URL — あなたの Match キーのリポジトリ URL (例: https://github.com/***/fastlane_match.git)

4. GitHub ワークフロー ファイルを設定します。

Create a GitHub workflow directory.

cd .github/workflows

内部 workflow folderにファイルを作成し、そのファイル名を build-upload-ios.ymlそして、以下を追加します。

name: Build source code on ios

on:
  push:
    tags:
      - '*'

jobs:
  build_ios:
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v6
      - name: set Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '24'
          cache: npm
      - name: Install dependencies
        id: install_code
        run: npm ci
      - name: Build
        id: build_code
        run: npm run build
      - uses: actions/cache@v5
        with:
          path: ios/App/Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-pods-
      - name: Sync
        id: sync_code
        run: npx cap sync
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.7.2
      - uses: maierj/fastlane-action@v2.3.0
        env:
          DEVELOPER_APP_IDENTIFIER: ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
          DEVELOPER_APP_ID: ${{ secrets.DEVELOPER_APP_ID }}
          PROVISIONING_PROFILE_SPECIFIER: match AppStore ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
          TEMP_KEYCHAIN_USER: ${{ secrets.TEMP_KEYCHAIN_USER }}
          TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}
          APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
          APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
          APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
          CERTIFICATE_STORE_URL: https://github.com/${{ secrets.CERTIFICATE_STORE_REPO }}.git
          GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
          GIT_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
          FASTLANE_APPLE_ID: ${{ secrets.FASTLANE_APPLE_ID }}
          MATCH_USERNAME: ${{ secrets.FASTLANE_APPLE_ID }}
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
          DEVELOPER_PORTAL_TEAM_ID: ${{ secrets.DEVELOPER_PORTAL_TEAM_ID }}
        with:
          lane: closed_beta
      - name: Upload release bundle
        uses: actions/upload-artifact@v2
        with:
          name: ios-release
          path: ./App.ipa
          retention-days: 60

このワークフローは、各 GitHub の後にトリガーされるべきです。 タグ必要に応じてタグの自動化を行う場合は、 自動ビルドおよびリリースのためのGitHubアクション 最初にこのワークフローを実行してください。

次に、このワークフローはNode.jsの依存関係を取得し、インストールし、JavaScriptアプリをビルドします。

コミットを送信するたびに、テストフライトでリリースが作成されます。

アプリはIonicを使用する必要はありません。ただし、Capacitorベースが必須であり、古いCordovaモジュールを使用してもかまいませんが、CapacitorのJSプラグインを使用することを推奨します。

5. ワークフローをトリガーする

コミットを作成する

コミット コミットを作成し、リポジトリでアクティブなワークフローを確認してください。5. Trigger workflow

ワークフローをトリガーする

ブランチに新しいコミットをプッシュする main または development Capacitorライブアップデートの代替手段を比較するページ。

Capacitorライブアップデートの代替手段を比較するページ。

Capawesomeの比較ページ。

Capawesomeの比較ページ。

コンサルティングサービスページ。

Appflowの比較/移行マーケティングコピー。

Appflowの比較/移行マーケティングコピー。

Appflowプラグインまたは

ワークフローをトリガーする。 my_project_path/fastlane path a file called ファイル名 そのファイルが Fastfile 同じファイルパスで secret properties found in our _GitHub, a_s below:

.envファイル

ローカルマシンからデプロイするために 環境変数 ターミナル Fastlane マシンから:

fastlane closed_beta

❌ 重要なのは .env ファイルについての説明は避けたいので、.gitignoreに追加する必要があります。 , 例えば:

fastlane/*.env

It should work the same as it happens from GitHub Actions on the remote machine but in our local machine. 🍻

ローカルFastlane実行

ターミナル実行: $ Fastlane closed_beta

ここまで来たら、恭喜恭喜! これでiOSアプリの自動化プロセスができました。FastlaneとGitHub Actionsを使用して。

毎回コミットを送ると、Google Playコンソールのベータチャンネルでリリースが作成されます。 このブログを改善するために、ご意見や質問がありましたら、メールでご連絡ください。 martin@capgo.app

デバイスでビルド

デバイスでビルドする必要がある場合は、手動でプロビジョニングに追加する必要があります。 Macにデバイスを接続し、デバイスメニューを開きます デバイスiOSメニュー 次に、識別子をコピーします 識別子iOS 次に、以下のコマンドを実行します: fastlane register_new_device デバイス名と識別子を設定するよう求められます デバイス名と識別子を設定する必要がある場合は、以下のコマンドを実行してください

問題が発生した場合

開発用デバイスで問題が発生したり、テストができない場合は、通常、以下のコマンドで解決できます。

デバイスでビルドするためのマジックコマンドがあります

fastlane match nuke development
fastlane match development

次に: プロジェクトをクリーンするには、Shift(⇧)+Command(⌘)+Kを押すか、Product > Clean(Clean Build Folderとラベル付けされている場合もあります)を選択します。

再度アプリをデバイス上で実行してみてください。

感謝します。

このブログは以下の記事に基づいています。

継続的デリバリーの自動化を進めていきましょう。Automatic Capacitor IOS ビルドとGitHubアクションを使用してMatchを実行します。

あなたが使用している Automatic Capacitor IOS ビルドとGitHubアクションを使用してMatchを実行している場合 CI/CDの自動化を計画するには、__CAPGO_KEEP_0__ CI/CDと接続する必要があります。 Capgo CI/CD Capgoの製品ワークフローにおけるCapgo CI/CDのために Capgoネイティブビルド Capgoの製品ワークフローにおけるCapgoネイティブビルドのために Capgo統合 Capgoの製品ワークフローにおけるCapgo統合のために CI/CD統合 Capgoの製品ワークフローの実装詳細はCI/CD統合にあります GitHubアクション統合 Capgoの製品ワークフローの実装詳細はGitHubアクション統合にあります

Capacitor アプリのリアルタイム更新

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

ウェブ層のバグが生じた場合、__CAPGO_KEEP_0__ を使用して修正を配信するのではなく、App Storeの承認待ちの日数を待たずに修正を配信することができます。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路を通じて実行されます。

コンテキスト:Capgoのマーケティングウェブサイト。役割:サポートする説明文またはメタ説明文。見られる場所:コンポーネントGetStarted.astro。Capgoの製品/ブランド名と開発者用語をそのままにします。メッセージキー:`instant_updates_for_capacitor_apps_description` (Capacitorアプリのリアルタイム更新の説明)。

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

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