Aller au contenu

Contrôles de pré-scan du build

Avant que le Capgo Cloud Build n'envoie votre projet, le CLI exécute un prescan qui détecte localement les problèmes d'identifiants, de projet et de configuration de store.

Il peut aussi s'exécuter seul :

Fenêtre de terminal
npx @capgo/cli@latest build prescan <appId> --platform ios

Il y a 80 des vérifications aujourd'hui. Préférez ignorer les ID de vérification individuels plutôt que de désactiver tout le scan.

Ignorer des vérifications spécifiques

Section intitulée « Ignorer certains contrôles »
Fenêtre de terminal
# 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

Alias standalone activés build prescan:

Fenêtre de terminal
npx @capgo/cli@latest build prescan <appId> --platform ios \
--skip ios/capacitor-server-url-shipped \
--warn ios/capacitor-server-cleartext

Unknown check ids fail fast with a clear error.

Contournements globaux (à utiliser avec parcimonie)

Section intitulée « Escapes globaux (à utiliser avec parcimonie) »
OptionEffet
--no-prescanIgnorer l'intégralité du scan
--prescan-ignore-fatal (ou --ignore-fatal sur build prescan)Run scan, print report, never block
--fail-on-warningsTraiter les warnings comme des erreurs fatales (CI)

--no-prescan et --prescan-ignore-fatal masquer ou contourner tous contrôles restants. Utilisez plutôt des overrides par contrôle si vous n'êtes pas d'accord avec une seule règle.

Utilisez l'id exact dans --prescan-skip / --prescan-warn.

Application progressive signifie que le résultat est purement informatif jusqu'à 2026-08-14, ce qui peut bloquer les builds.

IdPlateformesVérifications effectuéesApplication progressive
shared/apikey-permissionios, androidLa clé API peut demander des builds natifs—
shared/app-existsios, androidL'id de l'app existe et est visible pour la clé API—
shared/credentials-savedios, androidLes identifiants iOS/Android requis sont enregistrés localement—
shared/cap-sync-staleiOS, AndroidAssets web compilés et plugins Capacitor synchronisés—
shared/node-linker-layoutiOS, AndroidL'arborescence node_modules fonctionne avec les chemins natifs Capacitor—
shared/bundle-id-consistencyiOS, AndroidL'appId Capacitor correspond au bundle id / applicationId natif—
IdPlateformesVérifications effectuéesApplication progressive
ios/p12-opensiOSLe fichier .p12 iOS s'ouvre avec le mot de passe fourni—
ios/p12-expiryiOSLe certificat de signature iOS n'est pas expiré—
ios/profile-expiryiOSLe profil de provisionnement n'est pas expiré—
ios/profile-bundle-matchiOSLe bundle ID du profil de provisionnement correspond à l'app—
ios/profile-type-vs-modeiOSLe type de profil correspond au mode app_store / ad_hoc—
ios/cert-profile-pairingiOSLe certificat est intégré au profil de provisionnement—
ios/targets-coverediosTous les targets iOS possèdent un profil de provisionnement—
ios/infoplist-sanityiosInfo.plist contient les clés de version / d'identité requises—
ios/asc-key-validiosLes champs clés API d'App Store Connect semblent valides—
ios/asc-key-accessiosLa clé API d'ASC peut accéder à l'app (à distance)—
ios/plist-bundle-id-formatiosLe format du CFBundleIdentifier est valideOui
ios/plist-version-short-formatiosle format CFBundleShortVersionString est valideOui
ios/plist-version-build-formatiosle format CFBundleVersion est valideOui
ios/plist-encryption-complianceiosITSAppUsesNonExemptEncryption est déclaréOui
ios/plist-ats-arbitrary-loadsiosNSAllowsArbitraryLoads n'est pas activé pour la productionOui
ios/plist-launch-storyboardiOSL'écran de lancement est déclaréOui
ios/plist-orientations-multitaskingiOSLes paramètres d'orientation / multitâche sont cohérentsOui
ios/plist-orientations-presentiOSUISupportedInterfaceOrientations est déclaréOui
ios/plist-display-nameiOSLe nom d'affichage est configuréOui
ios/plist-background-modes-sanityiosLes valeurs UIBackgroundModes semblent validesOui
ios/plist-scene-lifecycle-xcode27iosL'app adopte le cycle de vie UIScene lors du build avec Xcode 27+ (requis par le SDK d'iOS 27)Oui
ios/xcode-deployment-target-capacitoriosLa cible de déploiement iOS respecte les exigences de CapacitorOui
ios/xcode-signing-teamiosL'équipe de signature est configuréeOui
ios/xcode-bundle-id-mismatch-across-configsiOSLe bundle ID est cohérent dans les configs XcodeOui
ios/xcode-enable-bitcode-leftoveriOSLe résidu ENABLE_BITCODE est suppriméOui
ios/xcode-swift-version-sanityiOSLe paramètre de version Swift semble correctOui
ios/xcode-no-app-targetiOSLe projet Xcode possède une cible d'applicationOui
ios/xcode-multiple-app-targetsiOSLa gestion de plusieurs cibles d'application est intentionnelleOui
ios/entitlements-vs-profile-capabilityiOSLes entitlements correspondent aux capacités du profilOui
ios/entitlements-aps-environment-vs-modeiOSL'aps-environment correspond au mode de distributionOui
ios/entitlements-associated-domains-formatiOSLe format des Associated Domains est valideOui
ios/entitlements-app-groups-formatiOSLe format des App Groups est valideOui
ios/capacitor-server-url-shippediOSserver.url n'est pas configuré comme un endpoint de live-reload / shell distant pour les builds destinés aux storesOui
ios/capacitor-server-cleartextiOSserver.cleartext n'est pas activé pour la productionOui
ios/capacitor-allow-navigation-wildcardiOSserver.allowNavigation n'est pas un wildcard globalOui
ios/pods-not-installediOSLes Pods CocoaPods / workspace sont présents lors de l'utilisation de PodsOui
ios/pods-lock-missingiOSLe Podfile.lock verrouille les versions des podsOui
ios/pods-capacitor-missingiOSLe Podfile lie CapacitorOui
ios/spm-package-resolved-missingiOSLe fichier SPM Package.resolved est présentOui
ios/spm-capacitor-dependency-missingiosPackage.swift déclare CapacitorOui
ios/appicon-empty-or-placeholderiosAppIcon.appiconset existe et n'est pas videOui
ios/appicon-referenced-file-missingiosLes fichiers d'icône Contents.json existent sur le disqueOui
ios/appicon-marketing-missingiosL'icône marketing 1024×1024 existeOui
ios/spm-deployment-target-consistencyiOSLa cible de déploiement SPM est cohérenteOui
IdPlateformesVérifications effectuéesApplication progressive
android/keystore-openset androidLe keystore Android s'ouvre avec les mots de passe fournis—
android/keystore-expiryet androidLe certificat de signature Android n'est pas expiré—
android/cordova-vars-presentet androidcordova.variables.gradle est présent après cap sync—
android/gradle-props-heuristicset androidheuristiques gradle.properties pour les erreurs de build courantes—
android/play-sa-jsonet androidle JSON du Play service-account est présent lorsqu'il est configuré—
android/flavor-existset androidle product flavor demandé existe—
android/agp8-package-attret androidl'attribut Manifest package= a été supprimé pour AGP 8+—
android/manifest-well-formedet androidAnalyse du fichier AndroidManifest.xml—
android/manifest-tag-typoet androidErreurs de frappe courantes dans les balises du manifest—
android/manifest-namespace-uriet androidL'URI du namespace xmlns:android est correcte—
android/manifest-missing-prefixet androidLes attributs Android utilisent le préfixe android:—
android/manifest-exported-missinget androidandroid:exported est défini lorsque nécessaire—
android/manifest-multiple-uses-sdket androidUn seul élément utilise sdk—
android/manifest-duplicate-componentet androidAucun composant en double—
android/manifest-unique-permissionet androidLes permissions personnalisées sont uniques—
android/manifest-hardcoded-debuggableet androiddebuggable=true n'est pas inclus—
android/manifest-mock-locationet androidACCESS_MOCK_LOCATION n'est pas inclus—
android/manifest-exported-unprotectedet androidLes composants exportés sont protégés—
android/manifest-query-all-packageset androidJustification pour QUERY_ALL_PACKAGES—
android/manifest-deeplink-validet androidLes intent-filters de Deeplink semblent valides—
android/applicationid-presentet androidL'applicationId est déclarée dans app/build.gradle—
android/capacitor-build-gradle-appliedet androidcapacitor.build.gradle existe lors de l'application—
android/gradle-wrapper-presentet androidLes fichiers Gradle wrapper sont présents—
android/flavor-dimensionset androidLes dimensions de flavor sont déclarées si des flavors existent—
android/google-services-fileet androidgoogle-services.json est présent lors de l'application du plugin—
android/local-properties-committedet androidlocal.properties n'est pas commit avec des secrets—
android/sdk-floorset androidmin/compile/target SDK semblent valides—
android/target-sdk-playet androidle targetSdk respecte les exigences du Play Store—
android/min-sdk-capacitoret androidle minSdk respecte les exigences de Capacitor—
android/version-fieldset androidversionCode / versionName sont présents—
android/play-sa-accesset androidle compte de service Play peut accéder à l'app (à distance)—

Déployer un shell natif qui charge une production server.url est un pattern Capacitor supporté. Prescan signale ios/capacitor-server-url-shipped car il s'agit souvent d'un résidu de live-reload.

Acquittez-le sans désactiver les autres vérifications :

Fenêtre de terminal
npx @capgo/cli@latest build request <appId> --platform ios \
--prescan-skip ios/capacitor-server-url-shipped

Ou gardez la visibilité sous forme d'avertissement :

Fenêtre de terminal
npx @capgo/cli@latest build request <appId> --platform ios \
--prescan-warn ios/capacitor-server-url-shipped