Saltare al contenuto principale

Come firmare e costruire un'app Capacitor nel cloud

Segna e costruisci il tuo Capacitor app nel cloud: crea il keystore Android e il certificato iOS, memorizza le credenziali in modo sicuro e esegui costruzioni firmate dal CI.

Crediti dell'articolo

Martin Donadieu

Scrittore

Valeria

Recensore

Jordan

Editore

Come firmare e costruire un Capacitor app nel cloud

Per firmare e costruire un Capacitor app nel cloud, crei i materiali di firma una volta (un keystore Android, un certificato di distribuzione iOS e un profilo di provisioning), li dai a un servizio di costruzione cloud e poi attivi le costruzioni dal tuo terminale o dal CI. Il servizio compila il progetto nativo, lo firma e può caricarlo direttamente su TestFlight o Google Play. Questa guida copre ogni file di firma, come crearli senza un Mac, come configurarli con Capgo Build e come automatizzare le costruzioni firmate in modo sicuro.

Cosa significa 'firmare nel cloud'

Entrambe le store accettano solo binari firmati. La firma dimostra che il costruito proviene da te e che nessuno l'ha modificato dopo. Localmente, Xcode e Android Studio nascondono la maggior parte di questo. Nel cloud, nulla è implicito, quindi devi sapere esattamente quali file sono coinvolti:

Piattaforma File Cosa è Utilizzato per
Android .jks / .keystore Chiave di caricamento del tuo keystore Firma del file AAB o APK
Android Account di servizio .json Credenziali di Google Cloud Caricamento su Google Play
iOS .p12 Certificato di distribuzione Apple più chiave privata Segna l'IPA
iOS .mobileprovision Profilo di provisioning che lega ID bundle, certificato e funzionalità Consentire all'app di eseguire e di essere distribuita
iOS .p8 + ID chiave + ID emittente App Store Connect API chiave Upload su TestFlight, leggi numeri di build

Mantieni questi fuori da Git. Tutto il resto li archivia nel tuo file di credenziali locale o nel tuo archivio segreto di CI.

Autenticazione Android

Creare il keystore di upload

If l'applicazione è già presente su Google Play, riutilizza il keystore esistente. La firma di un aggiornamento con una chiave diversa è rifiutata a meno che non si passi attraverso il reset della chiave di caricamento del Console di Gioco.

Per una nuova applicazione:

keytool -genkeypair -v \
  -storetype PKCS12 \
  -keystore release.jks \
  -alias upload \
  -keyalg RSA -keysize 2048 \
  -validity 10000

Note:

  • Google Play richiede che la chiave sia valida fino almeno al 22 ottobre 2033. -validity 10000 (circa 27 anni) copre questo.
  • Con il tipo di archiviazione PKCS12, la password della chiave è la stessa della password dell'archiviazione.
  • Non hai a disposizione un JDK? Il generatore di keystore Android produce lo stesso file nel browser.

Play App Signing e l'upload key

Le nuove applicazioni su Google Play utilizzano Play App Signing. Google detiene la chiave di firma dell'applicazione e riassegna ciò che gli utenti scaricano. Il tuo keystore è il carica la chiave. Se lo perdi, il supporto di Play Console può registrare una nuova chiave di caricamento, il che è il motivo per cui perderlo è un ritardo, non un disastro. Fai comunque una copia di backup.

Servizio di account per caricamenti

Per caricare dalla cloud, crea un servizio di account in Google Cloud, abilita il Google Play Android Developer API, scarica la sua chiave JSON e invita il servizio di account in Play Console sotto Utenti e autorizzazioni con le autorizzazioni di rilascio per la tua app. L'onboarding di Capgo può farlo tramite l'accesso Google, come mostrato di seguito.

firmatura iOS

I tre pezzi di Apple

  • Certificato di distribuzione Apple. Uno per team è sufficiente, valido per un anno. Apple limita il numero di quelli che puoi avere, quindi non crearne uno per sviluppatore.
  • Profilo di provisioning. Collega l'ID del bundle, il certificato e le funzionalità come le notifiche push. Utilizza un App Store Connect profilo per TestFlight e l'App Store, e un Ad Hoc profilo per installazioni su dispositivi registrati. Ogni estensione dell'app (widget, estensione di condivisione, servizio di notifica) ha bisogno del proprio profilo.
  • App Store Connect API chiave. Creato sotto Utenti e accesso > Integrazioni con accesso all'App Manager. Il .p8 file scarica solo una volta.

È necessario avere diritti di amministratore o titolare dell'account nel team di sviluppatore Apple per creare questi.

Creare un certificato senza un Mac

The Keychain Access flow richiede macOS, ma OpenSSL funziona in ogni dove:

# 1. Private key and certificate signing request
openssl req -new -newkey rsa:2048 -nodes \
  -keyout dist.key -out dist.csr \
  -subj "/emailAddress=dev@example.com/CN=Example Inc/C=US"

# 2. Upload dist.csr at developer.apple.com > Certificates > + > Apple Distribution
#    and download distribution.cer

# 3. Convert and bundle into a .p12
openssl x509 -inform DER -in distribution.cer -out distribution.pem
openssl pkcs12 -export -legacy \
  -inkey dist.key -in distribution.pem \
  -out distribution.p12 -passout pass:choose-a-password

The -legacy flag matters con OpenSSL 3: senza di esso, le macchine di costruzione macOS possono fallire nell'importare il .p12 con "verifica MAC fallita". Il browser-based Generatore di certificato iOS Poi crea il profilo di provisioning nel portale dei sviluppatori (

Crea quindi il profilo di provisioning nel portale dei sviluppatori ("Profili > + > App Store Connectseleziona il tuo ID app e il nuovo certificato, e scaricalo.

Imposta la firma con Capgo Costruisci

Capgo Build compiles and signs Capacitor apps on Capgo-managed machines, so you can build iOS from Windows or Linux. Start by logging in and registering the app:

bunx @capgo/cli@latest login
bunx @capgo/cli@latest app add
bunx @capgo/cli@latest build init --platform ios
bunx @capgo/cli@latest build init --platform android

Su iOS, l'onboarding crea o riutilizza il certificato di distribuzione e il profilo di provisioning per l'App Store con la tua chiave API di App Store Connect. Su macOS può anche guidarti nella creazione di quella chiave API. Su Android, crea o importa il keystore e può provvedere all'invio del servizio account Google Cloud e all'invito al Console di gioco attraverso l'accesso Google. Alla fine offre di avviare la prima compilazione.

Opzione B: salvare file esistenti

Se già hai i file dalle sezioni precedenti:

# iOS
bunx @capgo/cli@latest build credentials save \
  --platform ios \
  --certificate ./distribution.p12 \
  --p12-password "choose-a-password" \
  --ios-provisioning-profile ./AppStore.mobileprovision \
  --apple-key ./AuthKey_ABC1234567.p8 \
  --apple-key-id ABC1234567 \
  --apple-issuer-id 00000000-0000-0000-0000-000000000000 \
  --apple-team-id TEAM123456

# Android
bunx @capgo/cli@latest build credentials save \
  --platform android \
  --keystore ./release.jks \
  --keystore-alias upload \
  --keystore-key-password "store-password" \
  --keystore-store-password "store-password" \
  --play-config ./play-service-account.json

Per le app con estensioni, ripeti --ios-provisioning-profile con un bundleId=path mapping per ogni target:

  --ios-provisioning-profile com.example.app=./App.mobileprovision \
  --ios-provisioning-profile com.example.app.widget=./Widget.mobileprovision

Le credenziali sono memorizzate in ~/.capgo-credentials/credentials.json, chiavi da app ID e piattaforma. Aggiungi --local per memorizzarle nel .capgo-credentials.json al posto, e aggiungi quel file a .gitignoreControlla cosa viene salvato con bunx @capgo/cli@latest build credentials list.

Esegui una compilazione firmata

Prepara il progetto nativo, poi richiedi la compilazione:

bun run build
bunx cap sync

# iOS: sign with the App Store profile and upload to TestFlight
bunx @capgo/cli@latest build request com.example.app --platform ios --build-mode release

# Android: sign the AAB and upload to the internal track
bunx @capgo/cli@latest build request com.example.app --platform android --build-mode release --android-track internal

Il flusso dei log si riversa nel tuo terminale. Una scansione pre-compilazione controlla la scadenza del certificato, le password e la coppia di profili prima di caricare qualsiasi cosa, quindi la maggior parte degli errori di firma fallisce in secondi invece di minuti. Eseguiolo da solo con bunx @capgo/cli@latest build prescan --platform ios.

Variazioni utili:

Obiettivo Flag
Esegui una compilazione di test su iPhone registrati --ios-distribution ad_hoc --ios-provisioning-profile ./adhoc.mobileprovision --output-upload
APK per dispositivi MDM o kiosk --platform android --no-playstore-upload --output-upload
Inviaci direttamente alla revisione App --submit-to-store-review --store-release-name 2.4.0
Conserva il tuo numero di compilazione --skip-build-number-bump
Esegui una compilazione pulita senza cache --no-cache

Esegui una compilazione ad hoc, raccogli prima gli UDID dei dispositivi con il Finder di UDID per iOS e aggiungili al profilo.

Sviluppa costruisci ed esegui build firmati in CI

In CI, pass le credenziali come variabili di ambiente anziché un file di credenziali. Il CLI esporta esattamente ciò di cui hai bisogno:

bunx @capgo/cli@latest build credentials manage --appId com.example.app
# choose "Export to .env"

Sulla GitHub, invia ogni riga ai segreti del repository con un comando, poi cancella il file:

gh secret set -f .env.capgo.com.example.app
gh secret set CAPGO_TOKEN --body "your-capgo-api-key"
rm .env.capgo.com.example.app

Flusso di rilascio che firma e invia sia le piattaforme su un tag:

name: Signed release
on:
  push:
    tags: ['v*']

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        platform: [ios, android]
    steps:
      - uses: actions/checkout@v6
      - uses: oven-sh/setup-bun@v2
      - run: bun install --frozen-lockfile
      - run: bun run build
      - run: bunx cap sync ${{ matrix.platform }}
      - run: bunx @capgo/cli@latest build request com.example.app --platform ${{ matrix.platform }} --build-mode release
        env:
          CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          CAPGO_IOS_PROVISIONING_MAP_BASE64: ${{ secrets.CAPGO_IOS_PROVISIONING_MAP_BASE64 }}
          APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
          APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
          APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
          APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
          ANDROID_KEYSTORE_FILE: ${{ secrets.ANDROID_KEYSTORE_FILE }}
          KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }}
          KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
          KEYSTORE_STORE_PASSWORD: ${{ secrets.KEYSTORE_STORE_PASSWORD }}
          PLAY_CONFIG_JSON: ${{ secrets.PLAY_CONFIG_JSON }}

La job esegue su Linux. Nessun runner di macOS, nessun comando di keychain, nessun fastlane. Le stesse variabili di ambiente funzionano in qualsiasi CI: variabili di GitLab CI/CD, variabili di Bitbucket sicure, segreti di Gitea, o gruppi di variabili di Azure DevOps. Guida passo passo per le piattaforme: Flussi di Bitbucket Pipelines, azioni di Gitea, e le documentazioni delle azioni di GitHub.

Come vengono gestiti le tue chiavi

A domanda giusta prima di consegnare le chiavi di firma a qualsiasi servizio cloud. Con Capgo Build:

  • Le credenziali sono presenti sul tuo computer (~/.capgo-credentials/) o nel tuo archivio segreto CI. Capgo non mantiene una cassetta di sicurezza delle tue chiavi.
  • Per ogni build, CLI le invia tramite HTTPS. Vengono utilizzate solo durante quel build e vengono eliminate quando è completato.
  • Solo il progetto nativo preparato viene caricato. La tua sorgente web, .git, e .env i file non lo sono.
  • Gli app compilati vanno direttamente su App Store Connect o Google Play, o a un link di download a tempo limitato se lo richiedi.

Il trade-off: rotare una credenziale significa aggiornare i segreti CI da te stesso. Ri-esporta con build credentials manage e sposta nuovamente il file.

Scadenza e rotazione

Elemento Lifetime Che fare
Certificato di distribuzione Apple 1 anno Creare uno nuovo, rigenerare i profili, riassegnare, aggiornare CI
Profilo di provisioning 1 anno, o fino a quando il suo certificato viene revocato Rigenerare e riassegnare
App Store Connect API chiave Fino a quando revocato Revocare quando qualcuno con accesso lascia
Keystore di caricamento Android As long as its validity (impostalo per decenni) Ricordalo; resettalo tramite Console di Gioco se perduto
Chiave di account del servizio Play Fino a quando cancellato Rimuovilo ogni anno o quando cambia l'accesso

Mettere le date Apple in un calendario condiviso. Un certificato scaduto non influisce sugli app già installate sui dispositivi degli utenti, ma blocca ogni nuova build.

Risolvere i problemi

Error Causa e risoluzione
Provisioning profile doesn't include signing certificate Il profilo è stato generato per un certificato diverso. Regeneralo con quello attuale.
Provisioning profile doesn't match bundle ID La profilo è stato generato per un certificato diverso. Regeneralo con quello attuale. bundleId=path mappatura per ogni destinazione.
MAC verification failed Errato .p12 password, o OpenSSL 3 esportare senza -legacy.
Keystore was tampered with, or password was incorrect Errato password del magazzino, o il file è stato corrotto dai salti di linea base64.
Key alias not found Alias differisce da quello nel keystore. Elencalo con keytool -list -keystore release.jks.
Autenticazione App Store Connect fallita ID chiave o ID emittente sbagliato, chiave revocata o orologio di sistema distorto sul computer che firma il token.
Caricamento Play: l'utente non ha le autorizzazioni necessarie Account di servizio non invitato in Console Play, o lo sviluppatore Android API non abilitato.

Ulteriori correzioni sono nella Capgo Build troubleshooting guide e CI/CD per Capacitor: trappole comuni.

After il primo build firmato

Sono necessari solo i build nativi firmati quando cambiano le code. Per le modifiche JavaScript, CSS e HTML, invia un code live update Per applicazioni installate invece e conserva le costruzioni dello store per le rilascio che toccano plugin o configurazione nativa. Se provenite da un setup basato su Mac, Costruisci un'app iOS da Windows con Capgo Build mostra il workflow completo senza macOS.

Aggiornamenti in tempo reale per le app 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.

Ultimi articoli del nostro Blog

Capgo ti offre le migliori informazioni che ti servono per creare un'app mobile davvero professionale.