跳转到正文

构建预扫描检查

在 Capgo Cloud Build 上传您的项目之前,CLI 会运行一次 预扫描 (prescan) 以便在本地检测凭据、项目及商店配置问题。

它也可以独立运行:

终端窗口
npx @capgo/cli@latest build prescan <appId> --platform ios

目前共有 80 项检查。建议忽略特定的检查 ID,而不是直接关闭整个扫描。

终端窗口
# 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

上的独立别名 build prescan:

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

未知的检查 ID 会快速失败并返回清晰的错误。

标志效果
--no-prescan跳过整个扫描
--prescan-ignore-fatal (或 --ignore-fatal 开启 build prescan)运行扫描、打印报告,绝不阻塞
--fail-on-warnings将警告视为致命错误 (CI)

--no-prescan 以及 --prescan-ignore-fatal 隐藏或绕过 全部 剩余检查。如果只对某条规则有异议,请改用单项检查覆盖。

在……中使用确切的 id --prescan-skip / --prescan-warn.

逐步强制执行 意味着该发现项仅作信息提示,直到 2026-08-14,随后可能会导致构建被拦截。

ID平台检查内容逐步强制执行
shared/apikey-permissioniOS, AndroidAPI 密钥可以请求 Native Build—
shared/app-existsiOS, AndroidApp ID 已存在,且对 API 密钥可见—
shared/credentials-savediOS, Android本地保存必要的 iOS/Android 凭据—
shared/cap-sync-staleiOS, Android已构建 Web 资源并同步 Capacitor 插件—
shared/node-linker-layoutiOS, Androidnode_modules 布局与 Capacitor 原生路径兼容—
shared/bundle-id-consistencyiOS, AndroidCapacitor appId 与原生 bundle id / applicationId 一致—
ID平台检查内容逐步强制执行
ios/p12-opensiOSiOS .p12 文件密码正确—
ios/p12-expiryiOSiOS 签名证书未过期—
ios/profile-expiryiOSProvisioning profile 未过期—
ios/profile-bundle-matchiOSProvisioning profile 的 bundle id 与 App 匹配—
ios/profile-type-vs-modeiOSProfile 类型与 app_store / ad_hoc 模式匹配—
ios/cert-profile-pairingiOS证书已嵌入描述文件—
ios/targets-coverediOS所有 iOS Target 均已配置描述文件—
ios/infoplist-sanityiOSInfo.plist 包含必要的版本/标识符键值—
ios/asc-key-validiOSApp Store Connect API 关键字段校验通过—
ios/asc-key-accessiOSASC API 密钥可远程访问 App—
ios/plist-bundle-id-formatiOSCFBundleIdentifier 格式正确是
ios/plist-version-short-formatiOSCFBundleShortVersionString 格式有效是
ios/plist-version-build-formatiOSCFBundleVersion 格式有效是
ios/plist-encryption-complianceiOS已声明 ITSAppUsesNonExemptEncryption是
ios/plist-ats-arbitrary-loadsiOS生产环境未启用 NSAllowsArbitraryLoads是
ios/plist-launch-storyboardiOS已声明启动页 (Launch screen)是
ios/plist-orientations-multitaskingiOS屏幕方向 / 多任务设置一致是
ios/plist-orientations-presentiOS已声明 UISupportedInterfaceOrientations是
ios/plist-display-nameiOS已设置显示名称 (Display name)是
ios/plist-background-modes-sanityiOSUIBackgroundModes 值看起来有效是
ios/plist-scene-lifecycle-xcode27iOS使用 Xcode 27+ 构建时,App 会采用 UIScene 生命周期(iOS 27 SDK 的要求)是
ios/xcode-deployment-target-capacitoriOSiOS 部署目标符合 Capacitor 要求是
ios/xcode-signing-teamiOS已设置 Signing team是
ios/xcode-bundle-id-mismatch-across-configsiOSXcode 配置中的 Bundle ID 保持一致是
ios/xcode-enable-bitcode-leftoveriOS已移除残留的 ENABLE_BITCODE 设置是
ios/xcode-swift-version-sanityiOSSwift 版本设置正常是
ios/xcode-no-app-targetiOSXcode 项目包含 Application Target是
ios/xcode-multiple-app-targetsiOS有意支持多个 App Target是
ios/entitlements-vs-profile-capabilityiOSEntitlements 与 Profile 能力匹配是
ios/entitlements-aps-environment-vs-modeiOSaps-environment 与发布模式匹配是
ios/entitlements-associated-domains-formatiOSAssociated Domains 格式有效是
ios/entitlements-app-groups-formatiOSApp Groups 格式有效是
ios/capacitor-server-url-shippediOSserver.url 未保留为应用商店构建用的 live-reload / 远程 shell 端点是
ios/capacitor-server-cleartextiOS生产环境未启用 server.cleartext是
ios/capacitor-allow-navigation-wildcardiOSserver.allowNavigation 不是全量通配符是
ios/pods-not-installediOS使用 Pods 时存在 CocoaPods Pods / workspace是
ios/pods-lock-missingiOSPodfile.lock 固定了 pod 版本是
ios/pods-capacitor-missingiOSPodfile 已配置 Capacitor是
ios/spm-package-resolved-missingiOS存在 SPM Package.resolved是
ios/spm-capacitor-dependency-missingiOSPackage.swift 声明了 Capacitor是
ios/appicon-empty-or-placeholderiOSAppIcon.appiconset 已存在且不为空是
ios/appicon-referenced-file-missingiOSContents.json 中的图标文件已存在于磁盘上是
ios/appicon-marketing-missingiOS1024×1024 营销图标已存在是
ios/spm-deployment-target-consistencyiOSSPM 部署目标保持一致是
ID平台检查内容逐步强制执行
android/keystore-opensandroid使用提供的密码即可打开 Android keystore—
android/keystore-expiryandroidAndroid 签名证书未过期—
android/cordova-vars-presentandroid执行 cap sync 后存在 cordova.variables.gradle—
android/gradle-props-heuristicsandroid针对常见构建错误的 gradle.properties 启发式检查—
android/play-sa-jsonandroid已配置 Play service-account JSON—
android/flavor-existsandroid请求的 product flavor 存在—
android/agp8-package-attrandroid针对 AGP 8+ 已移除 Manifest package= 属性—
android/manifest-well-formedandroid解析 AndroidManifest.xml—
android/manifest-tag-typoandroid常见的 Manifest 标签拼写错误—
android/manifest-namespace-uriandroidxmlns:android 命名空间 URI 正确—
android/manifest-missing-prefixandroidAndroid 属性使用了 android: 前缀—
android/manifest-exported-missingandroid在必要处设置了 android:exported—
android/manifest-multiple-uses-sdkandroid仅使用了一个 sdk 元素—
android/manifest-duplicate-componentandroid无重复组件—
android/manifest-unique-permissionandroid自定义权限具有唯一性—
android/manifest-hardcoded-debuggableandroid未包含 debuggable=true—
android/manifest-mock-locationandroid未包含 ACCESS_MOCK_LOCATION—
android/manifest-exported-unprotectedandroid导出的组件已受保护—
android/manifest-query-all-packagesandroidQUERY_ALL_PACKAGES 权限说明—
android/manifest-deeplink-validandroidDeeplink intent-filters 格式正确—
android/applicationid-presentandroidapp/build.gradle 中已声明 applicationId—
android/capacitor-build-gradle-appliedandroid应用时 capacitor.build.gradle 已存在—
android/gradle-wrapper-presentandroidGradle wrapper 文件已就绪—
android/flavor-dimensionsandroid存在 flavors 时已声明 Flavor dimensions—
android/google-services-fileandroid应用插件时 google-services.json 已存在—
android/local-properties-committedandroidlocal.properties 未提交敏感信息—
android/sdk-floorsandroidmin/compile/target SDK 版本看起来正常—
android/target-sdk-playandroidtargetSdk 符合 Play Store 要求—
android/min-sdk-capacitorandroidminSdk 符合 Capacitor 要求—
android/version-fieldsandroid已配置 versionCode / versionName—
android/play-sa-accessandroidPlay 服务账号可远程访问该 App—

示例:远程 Next.js / server.url 壳程序

示例:“远程 Next.js / server.url shell” 章节

发布一个加载生产环境内容的 Native Build shell server.url 是受支持的 Capacitor 模式。Prescan 会标记出 ios/capacitor-server-url-shipped 因为它通常是 live-reload 遗留的问题。

在不禁用其他检查的情况下确认此项:

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

或者将其作为警告保留可见性:

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