Zum Hauptinhalt springen
CI/CD

Automatischer Capacitor IOS-Build mit GitHub-Aktionen mit Zertifikat

Wie Sie in 5 Minuten eine CI/CD-Pipeline für Ihre IOS-Ionic-App mit fastlane und GitHub-Aktionen einrichten

Artikelcredits

Martin Donadieu

Autor

Valeria

Rezensent

Jordan

Editor

Automatischer Capacitor IOS-Build mit GitHub-Aktionen mit Zertifikat

Die Einrichtung von CI/CD für Capacitor-Apps kann komplex und zeitaufwändig sein. Hier ist, was Sie wissen müssen:

Wir empfehlen nun die Verwendung von Capgo-Build mit der Capgo CLI für native Capacitor-Builds. Diese Fastlane-Anleitung wird für Teams aufrechterhalten, die bestehende GitHub-Actions-Pipelines weiterhin unterhalten, aber neue iOS-Builds sollten die Capgo CLI verwenden, damit Sie keine Fastlane, Xcode-Runner, Zertifikate, Berechtigungen und Upload-Skripte selbst pflegen müssen.

Capgo-Build für CI/CD von Capgo

Vermeiden Sie die Pflege von Fastlane, Xcode-Runner, Zertifikat, Berechtigungsprofil und Upload-Skript. Capgo-Build __CAPGO_KEEP_0__-Build führt signierte native iOS-Builds von Ihrem bestehenden CI/CD-Pipeline aus:

  • Arbeitet mit Ihrem Pipeline: Auslösen Capgo Build von GitHub Actions, GitLab CI, Jenkins oder lokalen Skripten nach Ihrem Web-Build und npx cap sync.
  • : Signieren von CI-Secrets: Halten Sie App Store Connect-Schlüssel, Zertifikate, Provisioning-Profiles, Passwörter und Team-IDs in Ihren eigenen CI-Secrets.
  • : Keine native Runner-Vermögensverwaltung: Capgo Build stellt gepflegte Apple-Build-Umgebungen bereit, daher müssen Sie macOS-Runner, Xcode-Bilder oder Fastlane-Linien nicht verwalten.
  • : Artefakte und Submission: Laden Sie signierte Artefakte für QA oder übermitteln Sie Release-Builds über die Capgo CLI.

: Preisgestaltung

  • : Capgo-Pläne beginnen bei 12 $/Monat
  • : Inklusive OTA-Updates und etwa 15 native Builds pro Monat
  • : Zusätzliche Build-Minuten werden nach Minute über Credits abgerechnet

Konfiguration von Capgo Build in CI/CD

Manueller Setup-Leitfaden

Hier ist, was Sie tun müssen:

Kontinuierliche Lieferung für iOS mit Fastlane und GitHub Aktionen und Zertifikat

Voraussetzungen

Bevor Sie mit der Anleitung fortfahren:

  • Stellen Sie sicher, dass Sie Fastlane installiert haben
  • auf Ihrem Entwicklungsrechner.

Stellen Sie sicher, dass Sie Mitglied des iOS-Entwicklerprogramms sind.

Wichtige Informationen zur Preisgestaltung von GitHub Action

https://github.com/features/actions

Der Service ist ‘gratis’ bis zum Limit, je nach gewählter Maschine.
Wir werden eine macOS Maschine verwenden, Sie können im Screenshot ihren Preis und Grenzen (Preise Stand der Erstellung dieses Tutorials, sie könnten sich in Zukunft ändern) sehen.

Nachdem Sie über Anforderungen und Preise informiert wurden, können wir fortfahren.

Hinweis: In diesem Beitrag gehe ich davon aus, dass Sie die App bereits in App Store Connect erstellt haben. Die wichtigen Informationen werden von Fastlane kopiert!

Was werden Sie in diesem Tutorial lernen?

Schritte, die Sie im Beitrag befolgen müssen.

  1. Die Verwendung von App Store Connect API mit Fastlane.
    • Anforderungen:
      • Erstellung eines App Store Connect-Schlüssels API
      • Verwendung eines App Store Connect-Schlüssels API
  2. Kopieren von Fastlane-Dateien
  3. Konfigurieren von GitHub-Aktionen

1. Verwendung von App Store Connect API mit Fastlane

Ab Februar 2021 ist für alle Benutzer eine zweifaktorale Authentifizierung oder eine zweistufige Überprüfung erforderlich, um sich bei App Store Connect anzumelden. Diese zusätzliche Sicherheitsschicht für Ihren Apple-ID hilft sicherzustellen, dass Sie der einzige Person sind, die Zugriff auf Ihr Konto hat.
Von Apple-Support

Anforderungen

Um sicherzustellen, dass Fastlane App Store Connect API verwenden kann, um Ihre App hochzuladen, müssen Sie die folgenden drei Anforderungen erfüllen drei Dinge:

  1. Zertifikats-ID
  2. Schlüssel-ID
  3. Schlüsseldatei oder Schlüsselinhalt

Erwerb eines App Store Connect API-Schlüssels

Um Schlüssel zu generieren, müssen Sie in App Store Connect die Administratorrechte haben. Wenn Sie diese Berechtigung nicht haben, können Sie den relevanten Personen diesen Artikel empfehlen.

  1. Anmelden bei App Store Connect.

  2. Wählen Sie Benutzer und Zugriff.

Zugriff auf App Store Connect

3 — Wählen Sie die Integrationsoption.

App Store Connect API Integration

  1. Klicken Sie auf Generate API Key oder auf die Schaltfläche Add (+).

App Store Connect API Schlüssel erstellen

  1. Geben Sie einem Schlüssel einen Namen. Der Name dient nur Ihrer Referenz und ist nicht Teil des Schlüssels selbst.

App Store Connect API Schlüssel erstellen: Name

6 — Unter Zugriff, wählen Sie die Rolle für den Schlüssel aus. Die Rollen, die auf Schlüssel anwendbar sind, sind dieselben Rollen, die auf Benutzer auf Ihrem Team anwendbar sind. Siehe Rollenberechtigungen. Wir empfehlen die Auswahl von App-Manager.

  1. Klicken Sie auf Generate.

Ein API-Schlüssels Zugriff kann nicht auf bestimmte Apps beschränkt werden.

Der Name des neuen Schlüssels, die Schlüssel-ID, ein Download-Link und weitere Informationen erscheinen auf der Seite.

App Store Connect Download-Schlüssel

Sie können alle drei notwendigen Informationen hier finden.
<1> Issue-ID. (APPLE_ISSUER_ID geheim)
<2> Schlüssel-ID. (APPLE_KEY_ID geheim)
<3> Klicken Sie auf „Download API-Schlüssel“ um Ihren API privaten Schlüssel herunterzuladen. Der Download-Link erscheint nur, wenn der private Schlüssel noch nicht heruntergeladen wurde. Apple hält keine Kopie des privaten Schlüssels. Daher können Sie ihn nur einmal herunterladen.

🔴 Speichern Sie Ihren privaten Schlüssel an einem sicheren Ort. Sie sollten Ihre Schlüssel niemals teilen, Schlüssel in einem code-Repository speichern oder Schlüssel in Client-Seiten code einbeziehen.

Verwendung eines App Store Connect API-Schlüssels

Das API-Schlüssel-Datei (p8-Datei, die Sie herunterladen), die Schlüssel-ID und die Aussteller-ID sind erforderlich, um den JWT-Token für die Autorisierung zu erstellen. Es gibt mehrere Möglichkeiten, diese Informationen in Fastlane einzugeben. Ich habe mich dafür entschieden, die neue Aktion von Fastlane zu verwenden. app_store_connect_api_keySie können andere Möglichkeiten in der Fastlane-Dokumentation. Ich zeige diese Methode, weil ich finde, dass es der einfachste Weg ist, mit den meisten CI-Tools zu arbeiten, bei denen Sie Umgebungsvariablen einstellen können.

Bitte konvertieren Sie das p8-File, das Sie herunterladen, in Base64 und speichern Sie es als Geheimnis (APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

Jetzt können wir App Store Connect mit Fastlane über die API-Schlüssel verwalten, großartig!

2. Zertifikate

Öffnen Sie XCode und gehen Sie zu Einstellungen > Konten > Apple-ID > Teams Wählen Sie Ihr Team.

Code Signierungsidentitäten

Klicken Sie auf Zertifikate verwalten.

Wenn Sie noch kein Zertifikat erstellt haben, können Sie ein neues Zertifikat erstellen.

Klicken Sie auf + und wählen Sie Apple Distribution

Apple Distribution

Dann müssen Sie zum Schlüsselkasten gehen, um das Zertifikat als .p12 Datei herunterzuladen.

Um dies zu tun, müssen Sie zum Schlüsselkasten gehen, auf die Schlüsselkasten-Schaltfläche klicken und auf die Anmeldung Zugriff auf das Schlüsselkasten und dann die Registerkarte Meine Zertifikate.

Meine Zertifikate

Wählen Sie dann das Zertifikat aus, das Sie herunterladen möchten. (Suchen Sie nach dem Datum des Zertifikats)

Und klicken Sie dann mit der rechten Maustaste auf den privaten Schlüssel auf dem Zertifikat und wählen Sie Exportieren.

Wählen Sie die Dateiformat Persönliche Informationen austauschen (.p12).

Das wird das Zertifikat als .p12 Datei herunterladen.

Öffnen Sie bitte die Datei in einem Terminal und verwenden Sie den folgenden Befehl, um sie in Base64 umzuwandeln:

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

Dies wird Ihr BUILD_CERTIFICATE_BASE64 Geheimnis. Bitte geben Sie auch, wenn gefragt wird, das Passwort des Zertifikats an. Dieses Passwort wird Ihr P12_PASSWORD Geheimnis.

3. Provisionierungsprofile

Öffnen Apple Developer und wählen Sie das richtige Team.

Erstellen Sie dann ein neues Profil, indem Sie auf +

Ein neues Profil erstellen

und wählen Sie App Store Connect.

Wählen Sie App Store Connect

Wählen Sie das richtige App, beachten Sie, dass Sie Wildcard nicht verwenden können, sonst wird die Signierung fehlschlagen.

Wählen Sie das richtige App

Wählen Sie das richtige Zertifikat, das Sie vorher erstellt haben (suchen Sie nach dem Datum der Ablaufzeit, es sollte der gleiche Tag und Monat wie heute sein) und klicken Sie auf Fortsetzen.

Wählen Sie das richtige Zertifikat

Schließlich geben Sie den Namen des Profils ein und klicken Sie auf Erstellen.

Der Name wird zum Identifizieren des Profils in Fastlane unter der Werte verwendet APPLE_PROFILE_NAME.

Erstellen Sie das Profil

Sie können das Profil als Datei herunterladen. .mobileprovision Herunterladen Sie das Profil

Sie können das Profil als Datei herunterladen.

Bitte wandeln Sie das Profil in Base64 um und speichern Sie es als Geheimnis (BUILD_PROVISION_PROFILE_BASE64).

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

4. Kopieren Sie die Fastlane-Dateien

Fastlane ist eine Ruby-Bibliothek, die zum Automatisieren von gängigen Aufgaben der mobilen Entwicklung erstellt wurde. Mit Fastlane können Sie benutzerdefinierte "Bahnen" konfigurieren, die eine Reihe von "Aktionen" enthalten, die Aufgaben ausführen, die Sie normalerweise mit Android Studio durchführen würden. Mit Fastlane können Sie viel erreichen, aber für die Zwecke dieses Tutorials werden wir nur eine Handvoll grundlegender Aktionen verwenden.

Erstellen Sie das Fastlane-Verzeichnis am Root Ihres Capacitor/Ionic-Projekts und fügen Sie das Fastfile dort hin:

  • Ordner: <project-root>/fastlane/
  • Datei: <project-root>/fastlane/Fastfile

Dies ist auf derselben Ebene wie package.json, capacitor.config.*, und das ios/ Verzeichnis. Erstellen Sie es nicht innerhalb von ios/App/.

platform :ios do
  desc 'Export ipa and submit to TestFlight'
  lane :beta do
    keychain_info = { keychain_name: "ios-build-#{Time.now.to_i}.keychain", keychain_password: SecureRandom.uuid }
    
    begin
      setup_signing(keychain_info)
      bump_build_number
      build_app_with_signing(keychain_info)
      submit_to_testflight
    ensure
      cleanup_keychain(keychain_info)
    end
  end

  private_lane :setup_signing do |options|
    create_keychain(
      name: options[:keychain_name],
      password: options[:keychain_password],
      unlock: true,
      timeout: 0,
      lock_when_sleeps: false, 
      add_to_search_list: true
    )
    import_cert(options)
    install_profile
    update_project_settings
  end

  lane :bump_build_number do
		file = File.read('../package.json')
		data_hash = JSON.parse(file)
		api_key = app_store_connect_api_key(
      key_id: ENV['APPLE_KEY_ID'],
      issuer_id: ENV['APPLE_ISSUER_ID'],
      key_content: ENV['APPLE_KEY_CONTENT'],
      is_key_content_base64: true,
      duration: 1200,
      in_house: false
    )
		build_num = app_store_build_number(
      api_key: api_key,
			app_identifier: ENV['BUNDLE_IDENTIFIER'],
			live: false
    )
		build_num = build_num + 1
		UI.message("Bumped build number to #{build_num}")
		increment_build_number(
			build_number: build_num,
			xcodeproj: "./ios/App/App.xcodeproj",
			skip_info_plist: true
		)
	end

  private_lane :import_cert do |options|
    cert_path = "#{Dir.tmpdir}/build_certificate.p12"
    File.write(cert_path, Base64.decode64(ENV['BUILD_CERTIFICATE_BASE64']))
    import_certificate(
      certificate_path: cert_path,
      certificate_password: ENV['P12_PASSWORD'] || "",
      keychain_name: options[:keychain_name],
      keychain_password: options[:keychain_password],
      log_output: true
    )
    File.delete(cert_path)
  end  
  
  private_lane :cleanup_keychain do |options|
    delete_keychain(
      name: options[:keychain_name]
    )
  end  

  private_lane :install_profile do
    profile_path = "#{Dir.tmpdir}/build_pp.mobileprovision"
    File.write(profile_path, Base64.decode64(ENV['BUILD_PROVISION_PROFILE_BASE64']))
    UI.user_error!("Failed to create provisioning profile at #{profile_path}") unless File.exist?(profile_path)
    ENV['PROVISIONING_PROFILE_PATH'] = profile_path
    install_provisioning_profile(path: profile_path)
    File.delete(profile_path)
  end

  private_lane :update_project_settings do
    update_code_signing_settings(
      use_automatic_signing: false,
      path: "./ios/App/App.xcodeproj",
      code_sign_identity: "iPhone Distribution",
      profile_name: ENV['APPLE_PROFILE_NAME'],
      bundle_identifier: ENV['BUNDLE_IDENTIFIER'],
      team_id: ENV['APP_STORE_CONNECT_TEAM_ID']
    )
    update_project_team(
      path: "./ios/App/App.xcodeproj",
      teamid: ENV['APP_STORE_CONNECT_TEAM_ID']
    )
  end

  private_lane :build_app_with_signing do |options|
    unlock_keychain(
      path: options[:keychain_name],
      password: options[:keychain_password],
      set_default: false
    )
    build_app(
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      configuration: "Release",
      export_method: "app-store",
      output_name: "App.ipa",
      export_options: {
        provisioningProfiles: {
          ENV['BUNDLE_IDENTIFIER'] => ENV['APPLE_PROFILE_NAME']
        }
      },
      xcargs: "-verbose",
      buildlog_path: "./build_logs",
      export_xcargs: "-allowProvisioningUpdates",
    )
  end   

  private_lane :submit_to_testflight do
    api_key = app_store_connect_api_key(
      key_id: ENV['APPLE_KEY_ID'],
      issuer_id: ENV['APPLE_ISSUER_ID'],
      key_content: ENV['APPLE_KEY_CONTENT'],
      is_key_content_base64: true,
      duration: 1200,
      in_house: false
    )
    pilot(
      api_key: api_key,
      skip_waiting_for_build_processing: true,
      skip_submission: true,
      distribute_external: false,
      notify_external_testers: false,
      ipa: "./App.ipa"
    )
  end
end

5. Einstellung von Geheimnissen

GitHub Actions verwenden die Repository-Geheimnisse, die Sie in der nächsten Schritt konfigurieren. Sie benötigen nur eine lokale .env Datei, wenn Sie Fastlane von Ihrem eigenen Computer aus ausführen oder testen möchten.

Für lokale Tests erstellen <project-root>/fastlane/.env neben dem Fastfile. Fügen Sie dies nicht in Ihre Versionssystem ein. Fügen Sie fastlane/.env zu Ihrer .gitignore (oder überprüfen Sie, ob es bereits ignoriert wird). Hier ist ein Beispiel:

APP_STORE_CONNECT_TEAM_ID=UVTJ336J2D
BUNDLE_IDENTIFIER=ee.forgr.testfastlane
# See previous section for these secrets
BUILD_CERTIFICATE_BASE64=
BUILD_PROVISION_PROFILE_BASE64=
APPLE_KEY_ID=
APPLE_ISSUER_ID=
APPLE_KEY_CONTENT=
P12_PASSWORD=
APPLE_PROFILE_NAME=

Erhalten Sie die APP_STORE_CONNECT_TEAM_ID

Gehe zu Zentrum für Entwickler und scrollen Sie nach unten zu Membership details Sektion. Die Team ID ist der Wert, den Sie in der APP_STORE_CONNECT_TEAM_ID geheim halten müssen.

App-Store-Connect-Team-ID

BUNDLE_IDENTIFIER abrufen

  1. Xcode öffnen
  2. Doppelklicken Sie auf das App in dem Projektnavigator
  3. Klicken Sie dann auf die Registerkarte Signing and Capabilities
  4. Kopieren Sie den Wert von dem Bundle identifierDies ist der Wert, den Sie im BUNDLE_IDENTIFIER Geheimnis einstellen müssen.
bundle-identifier-xcode

6. Aufbereitung

In GitHub Aktionen, Sie werden auf der Grundlage der Minuten berechnet, die Sie für die Ausführung Ihres CI/CD-Workflows verwendet haben. Meiner Erfahrung nach dauert es etwa 10–15 Minuten, bevor ein Build in App Store Connect bearbeitet werden kann.

Für private Projekte kann die geschätzte Kosten pro Build bis zu $0,08/min x 15 min = $1,2, oder mehr, je nach Konfiguration und Abhängigkeiten Ihres Projekts.

Wenn Sie sich um die Kosten für private Projekte Sorgen, können Sie skip_waiting_for_build_processing festlegen. trueDies wird die Build-Minuten sparen, indem Sie nicht auf die Bearbeitung des Builds in App Store Connect warten.

Es gibt jedoch einen Kompromiss - Sie müssen die Compliance-Informationen Ihres Apps in App Store Connect manuell aktualisieren, bevor Sie den Build an die Benutzer verteilen können.

This optimization is mainly useful for private projects where build minutes cost money. For public/free projects, the build minutes are free so there’s no need to enable this setting. See GitHub’s Pricing-Seite für weitere Details.

7. Einrichten von GitHub Aktionen

Konfigurieren Sie GitHub-Geheimnisse

Bitte kopieren Sie die Geheimnisse aus dem .env Datei und fügen Sie sie in die GitHub-Repository-Geheimnisse ein.

Gehe zu Einstellungen &gt; Geheimnisse und Variablen &gt; Aktionen &gt; Neues Repository-Geheimnis

github-Geheimnisse

2. BUILD_CERTIFICATE_BASE64 - Zertifikat im Base64-Code.

3. BUILD_PROVISION_PROFILE_BASE64 - Zertifikat im Base64-Code.

4. BUNDLE_IDENTIFIER - Ihre App-Identifikationsnummer.

5. APPLE_KEY_ID — App Store Connect API-Schlüssel 🔺Schlüssel-ID.

6. APPLE_ISSUER_ID — App Store Connect API-Schlüssel 🔺Aussteller-ID.

7. APPLE_KEY_CONTENT — App Store Connect API-Schlüssel 🔺 Inhalt des Schlüssels .p8, überprüfen

8. Konfigurieren Sie das GitHub-Workflow-File

Erstellen Sie ein GitHub-Workflow-Verzeichnis

cd .github/workflows

Im workflow Ordner, erstellen Sie ein Datei mit dem Namen build-upload-ios.ymlund fügen Sie Folgendes hinzu.

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: '3.0'
          bundler-cache: true
      - uses: maierj/fastlane-action@v3.1.0
        env:
          APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
          BUNDLE_IDENTIFIER: ${{ secrets.BUNDLE_IDENTIFIER }}
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
          APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
          APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
          APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          APPLE_PROFILE_NAME: ${{ secrets.APPLE_PROFILE_NAME }}
        with:
          lane: ios beta
      - name: Upload release bundle
        uses: actions/upload-artifact@v6
        with:
          name: ios-release
          path: ./App.ipa
          retention-days: 10

Diese Workflow sollte nach jedem GitHub Tagausgelöst werden. Wenn Sie die Automatisierung von Tags benötigen, beziehen Sie sich bitte auf Automatische Build- und Release-Vorgänge mit GitHub-Actions zuerst.

Dann wird dieser Workflow Ihre NodeJS-Abhängigkeiten herunterladen, sie installieren und Ihre JavaScript-Anwendung bauen.

Jedes Mal, wenn Sie einen neuen Commit senden, wird eine Release in TestFlight erstellt.

Ihre App benötigt nicht zwingend Ionic, nur die Capacitor-Basis ist erforderlich. Sie kann alte Cordova-Module haben, aber die Capacitor-JS-Plugin wird empfohlen.

8. Auslösen Sie den Workflow

Erstellen Sie einen Commit

Ein Commit machen SieSie sehen die aktive Workflow im Repository.

den Workflow auslösen

oder main Pushen Sie die neuen Commits in die Zweig development oder

auslösen Sie den Workflow

mit dem neuen Commit

nach einigen Minuten sollte der Build in Ihrem App Store Connect-Dashboard verfügbar sein.

Testflights Dashboard

9. Kann ich von der lokalen Maschine bereitstellen?

Sie können Xcode verwenden, um Ihre App zu erstellen und zu signieren, wie immer.

CI/CD-Einrichtungsanleitungen

Alternative CI/CD-Plattformen

Live-Updates &amp; Bereitstellung

Danke

Dieser Blog basiert auf den folgenden Artikeln:

Fortsetzen Sie mit der automatischen Capacitor-IOS-Build mit GitHub-Aktionen mit Zertifikat

Wenn Sie __CAPGO_KEEP_0__ verwenden Die automatische Capacitor-IOS-Build mit GitHub-Aktionen mit Zertifikat um die CI/CD-Automatisierung zu planen, verbinden Sie es mit Capgo-CI/CD für das Produktworkflow in Capgo-CI/CD, Capgo-Native Builds für das Produktworkflow in Capgo-Native Builds, Capgo-Integrations für den Produktworkflow in Capgo Integrations CI/CD-Integration für die Implementierungsdetails in CI/CD-Integration und GitHub Aktionen-Integration für die Implementierungsdetails in GitHub Aktionen-Integration

Live-Updates für Capacitor-Apps

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.

Wenn ein Bug im Weblayer lebt, schicken Sie die Reparatur über __CAPGO_KEEP_0__ anstatt Tage für die Genehmigung im App-Store abzuwarten. Die Benutzer erhalten die Aktualisierung im Hintergrund, während native Änderungen im normalen Review-Prozess bleiben.

Kontext: Capgo-Marketingwebsite. Rolle: Unterstützende Beschreibung oder Meta-Beschreibung. Gesehen in: Komponente GetStarted.astro. Bewahren Sie Capgo-Produkt- und Entwicklertitel genau. Nachrichtenschlüssel `instant_updates_for_capacitor_apps_description` (Instant Updates For Capacitor Apps Description).

Menschliche Unterstützung von Martin

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