Zum Inhalt springen

Build-Prescan-Checks

Bevor Capgo Cloud Build dein Projekt hochlädt, führt der CLI einen Prescan durch, der Probleme mit Credentials, dem Projekt oder der Store-Konfiguration lokal erkennt.

Es kann auch standalone ausgeführt werden:

Terminalfenster
npx @capgo/cli@latest build prescan <appId> --platform ios

Es gibt 80 Checks heute. Es ist besser, einzelne Check-IDs zu ignorieren, anstatt den gesamten Scan zu deaktivieren.

Terminalfenster
# Skip one check entirely (example: intentional Capacitor server.url / Next.js shell)
npx @capgo/cli@latest build request <appId> --platform ios \
--prescan-skip ios/capacitor-server-url-shipped
# Run the check but never block on it (error becomes warning)
npx @capgo/cli@latest build request <appId> --platform ios \
--prescan-warn ios/capacitor-server-url-shipped
# Repeatable or comma-separated
npx @capgo/cli@latest build request <appId> --platform ios \
--prescan-skip ios/capacitor-server-url-shipped \
--prescan-warn ios/capacitor-allow-navigation-wildcard,ios/plist-ats-arbitrary-loads

Standalone-Aliase auf build prescan:

Terminalfenster
npx @capgo/cli@latest build prescan <appId> --platform ios \
--skip ios/capacitor-server-url-shipped \
--warn ios/capacitor-server-cleartext

Unbekannte Check-IDs führen sofort zu einem klaren Fehler.

FlagEffekt
--no-prescanDen gesamten Scan überspringen
--prescan-ignore-fatal (oder --ignore-fatal auf build prescan)Scan ausführen, Report erstellen, nie blockieren
--fail-on-warningsWarnungen als Fehler behandeln (CI)

--no-prescan und --prescan-ignore-fatal ausblenden oder umgehen alle verbleibende Checks. Nutze stattdessen Overrides pro Check, wenn du nur mit einer Regel nicht einverstanden bist.

Verwende die exakte ID in --prescan-skip / --prescan-warn.

Schrittweise Durchsetzung bedeutet, dass der Befund nur zur Information dient, bis 2026-08-14, was Builds blockieren kann.

IDPlattformenPrüfungsinhaltSchrittweise Durchsetzung
shared/apikey-permissioniOS, AndroidAPI Key kann Native Builds anfordern—
shared/app-existsiOS, AndroidApp-ID existiert und ist für den API Key sichtbar—
shared/credentials-savediOS, AndroidErforderliche iOS/Android-Credentials werden lokal gespeichert—
shared/cap-sync-staleiOS, AndroidWeb-Assets gebaut und Capacitor Plugins synchronisiert—
shared/node-linker-layoutiOS, Androidnode_modules-Layout kompatibel mit Capacitor nativen Pfaden—
shared/bundle-id-consistencyiOS, AndroidCapacitor appId stimmt mit nativem Bundle ID / applicationId überein—
IDPlattformenPrüfungsinhaltSchrittweise Erzwingung
ios/p12-opensiOSiOS .p12 lässt sich mit dem Passwort öffnen—
ios/p12-expiryiOSiOS Signing-Zertifikat ist nicht abgelaufen—
ios/profile-expiryiOSProvisioning Profile ist nicht abgelaufen—
ios/profile-bundle-matchiOSProvisioning Profile Bundle ID stimmt mit der App überein—
ios/profile-type-vs-modeiOSProfiltyp passt zu app_store / ad_hoc Modus—
ios/cert-profile-pairingiOSZertifikat ist im Provisioning Profile eingebettet—
ios/targets-coverediOSAlle iOS-Targets haben ein Provisioning Profile—
ios/infoplist-sanityiOSInfo.plist enthält erforderliche Version- und Identity-Keys—
ios/asc-key-validiOSApp Store Connect API Key-Felder sehen gültig aus—
ios/asc-key-accessiOSASC API Key kann auf die App zugreifen (remote)—
ios/plist-bundle-id-formatiOSCFBundleIdentifier-Format ist gültigJa
ios/plist-version-short-formatiOSCFBundleShortVersionString-Format ist gültigJa
ios/plist-version-build-formatiOSCFBundleVersion-Format ist gültigJa
ios/plist-encryption-complianceiOSITSAppUsesNonExemptEncryption ist deklariertJa
ios/plist-ats-arbitrary-loadsiOSNSAllowsArbitraryLoads ist nicht für Production aktiviertJa
ios/plist-launch-storyboardiOSLaunch Screen ist deklariertJa
ios/plist-orientations-multitaskingiOSAusrichtung / Multitasking-Einstellungen sind konsistentJa
ios/plist-orientations-presentiOSUISupportedInterfaceOrientations ist deklariertJa
ios/plist-display-nameiOSAnzeigename ist gesetztJa
ios/plist-background-modes-sanityiOSUIBackgroundModes-Werte scheinen gültigJa
ios/plist-scene-lifecycle-xcode27iOSDie App nutzt den UIScene-Lifecycle beim Build mit Xcode 27+ (erforderlich für den iOS 27 SDK)Ja
ios/xcode-deployment-target-capacitoriOSiOS Deployment Target erfüllt Capacitor AnforderungenJa
ios/xcode-signing-teamiOSSigning Team ist gesetztJa
ios/xcode-bundle-id-mismatch-across-configsiOSBundle-ID ist in allen Xcode-Configs konsistentJa
ios/xcode-enable-bitcode-leftoveriOSÜberbleibsel von ENABLE_BITCODE wurden entferntJa
ios/xcode-swift-version-sanityiOSSwift-Versionseinstellung ist korrektJa
ios/xcode-no-app-targetiOSXcode-Projekt enthält ein Application TargetJa
ios/xcode-multiple-app-targetsiOSMehrere App-Targets werden bewusst behandeltJa
ios/entitlements-vs-profile-capabilityiOSEntitlements stimmen mit den Profil-Capabilities übereinJa
ios/entitlements-aps-environment-vs-modeiOSaps-environment passt zum Distribution-ModusJa
ios/entitlements-associated-domains-formatiOSFormat der Associated Domains ist gültigJa
ios/entitlements-app-groups-formatiOSApp-Groups-Format ist gültigJa
ios/capacitor-server-url-shippediOSserver.url ist kein Live-Reload / Remote-Shell-Endpunkt für Store-BuildsJa
ios/capacitor-server-cleartextiOSserver.cleartext ist nicht für Production aktiviertJa
ios/capacitor-allow-navigation-wildcardiOSserver.allowNavigation ist kein pauschaler WildcardJa
ios/pods-not-installediOSCocoaPods Pods / workspace sind vorhanden, wenn Pods genutzt werdenJa
ios/pods-lock-missingiOSPodfile.lock fixiert die Pod-VersionenJa
ios/pods-capacitor-missingiOSPodfile verknüpft CapacitorJa
ios/spm-package-resolved-missingiOSSPM Package.resolved ist vorhandenJa
ios/spm-capacitor-dependency-missingiOSPackage.swift deklariert CapacitorJa
ios/appicon-empty-or-placeholderiOSAppIcon.appiconset ist vorhanden und nicht leerJa
ios/appicon-referenced-file-missingiOSContents.json Icon-Dateien existieren auf der FestplatteJa
ios/appicon-marketing-missingiOS1024×1024 Marketing-Icon ist vorhandenJa
ios/spm-deployment-target-consistencyiOSSPM-Deployment-Target ist konsistentJa
IDPlattformenPrüfungsinhaltSchrittweise Erzwingung
android/keystore-opensAndroidAndroid Keystore öffnet sich mit den angegebenen Passwörtern—
android/keystore-expiryAndroidAndroid-Signaturzertifikat ist nicht abgelaufen—
android/cordova-vars-presentAndroidcordova.variables.gradle ist nach cap sync vorhanden—
android/gradle-props-heuristicsAndroidgradle.properties-Heuristiken für häufige Build-Fehler—
android/play-sa-jsonAndroidPlay-Service-Account-JSON ist vorhanden, wenn konfiguriert—
android/flavor-existsAndroidAngeforderter Product Flavor existiert—
android/agp8-package-attrAndroidpackage=-Attribut im Manifest für AGP 8+ entfernt—
android/manifest-well-formedAndroidAndroidManifest.xml wird geparst—
android/manifest-tag-typoAndroidHäufige Tippfehler in Manifest-Tags—
android/manifest-namespace-uriAndroidxmlns:android Namespace-URI ist korrekt—
android/manifest-missing-prefixAndroidAndroid-Attribute nutzen das android:-Präfix—
android/manifest-exported-missingAndroidandroid:exported ist dort gesetzt, wo nötig—
android/manifest-multiple-uses-sdkAndroidNur ein Element nutzt sdk—
android/manifest-duplicate-componentAndroidKeine doppelten Komponenten—
android/manifest-unique-permissionAndroidEigene Berechtigungen sind eindeutig—
android/manifest-hardcoded-debuggableAndroiddebuggable=true nicht enthalten—
android/manifest-mock-locationAndroidACCESS_MOCK_LOCATION nicht enthalten—
android/manifest-exported-unprotectedAndroidExportierte Komponenten sind geschützt—
android/manifest-query-all-packagesAndroidBegründung für QUERY_ALL_PACKAGES—
android/manifest-deeplink-validAndroidDeeplink-Intent-Filter scheinen gültig zu sein—
android/applicationid-presentAndroidapplicationId ist in app/build.gradle definiert—
android/capacitor-build-gradle-appliedAndroidcapacitor.build.gradle ist vorhanden—
android/gradle-wrapper-presentAndroidGradle-Wrapper-Dateien sind vorhanden—
android/flavor-dimensionsAndroidFlavor-Dimensionen sind definiert, falls Flavors existieren—
android/google-services-fileAndroidgoogle-services.json ist vorhanden, wenn Plugin aktiv ist—
android/local-properties-committedAndroidlocal.properties wurde nicht mit Secrets committet—
android/sdk-floorsAndroidmin/compile/target SDK Floors scheinen valide—
android/target-sdk-playAndroidtargetSdk erfüllt Play-Anforderungen—
android/min-sdk-capacitorAndroidminSdk erfüllt Capacitor Anforderungen—
android/version-fieldsAndroidversionCode / versionName sind vorhanden—
android/play-sa-accessAndroidPlay Service Account hat Zugriff auf die App (remote)—

Beispiel: remote Next.js / server.url Shell

Abschnitt: „Beispiel: Remote Next.js / server.url Shell“

Versand eines Native Build Shells, das eine Produktion lädt server.url ist ein unterstütztes Capacitor Pattern. Prescan schlägt dies vor, ios/capacitor-server-url-shipped da es sich oft um ein Überbleibsel von Live-Reload handelt.

Bestätigen Sie dies, ohne andere Checks zu deaktivieren:

Terminalfenster
npx @capgo/cli@latest build request <appId> --platform ios \
--prescan-skip ios/capacitor-server-url-shipped

Oder behalten Sie die Sichtbarkeit als Warnung bei:

Terminalfenster
npx @capgo/cli@latest build request <appId> --platform ios \
--prescan-warn ios/capacitor-server-url-shipped