빌드 전 검사
설치 단계와 이 플러그인의 전체 마크다운 가이드를 포함한 설정 명령을 복사하세요.
Capgo Cloud Build가 프로젝트를 업로드하기 전에 CLI가 실행됩니다. prescan 또한 독립적으로 실행됩니다:
터미널 창
npx @capgo/cli@latest build prescan <appId> --platform ios오늘은 80 개별 체크 아이디를 무시하는 것보다 전체 스캔을 끄는 것보다 좋습니다.
특정 체크 무시
제목: 특정 체크 무시# 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-separatednpx @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알 수 없는 체크 아이디는 빠른 오류와 함께 실패합니다.
모든 다른 체크가 여전히 빌드 보호합니다.
전역 탈출 (적극 사용하지 않음)| Flag | 플래그 |
|---|---|
--no-prescan | 효과 |
--prescan-ignore-fatal 스캔 전체 생략 --ignore-fatal (또는 build prescan) | 페이지 |
--fail-on-warnings | 스캔 실행, 보고서 출력, 블록하지 않음 |
--no-prescan 및 --prescan-ignore-fatal 숨기거나 피하기 모두 남은 체크를 숨기거나 피합니다. 하나의 규칙에 대해만 불합치할 때는 체크별로 오버라이드를 사용하세요.
체크 카탈로그
체크 카탈로그정확한 id를 사용하세요 --prescan-skip / --prescan-warn.
점진적 강제 의사결정은 정보만 제공할 때까지 2026-08-14그런 다음 빌드가 중단될 수 있습니다.
공유
공유| ID | 플랫폼 | 체크하는 내용 | 점진적 강제 |
|---|---|---|---|
shared/apikey-permission | iOS, 안드로이드 | API 키가 네이티브 빌드를 요청할 수 있습니다 | — |
shared/app-exists | iOS, 안드로이드 | API 키가 앱 ID가 존재하고 앱 ID가 API 키에 표시되어야 함 | — |
shared/credentials-saved | iOS, 안드로이드 | iOS/Android 인증 정보가 로컬에 저장되어야 함 | — |
shared/cap-sync-stale | iOS, 안드로이드 | 웹 자산이 빌드되고 Capacitor 플러그인이 동기화 | — |
shared/node-linker-layout | iOS, 안드로이드 | node_modules 레이아웃은 Capacitor 네이티브 경로와 함께 작동합니다. | — |
shared/bundle-id-consistency | iOS, 안드로이드 | Capacitor 앱 아이디는 네이티브 번들 아이디 / applicationId와 일치합니다. | — |
iOS
iOS 제목| ID | 플랫폼 | 체크하는 내용 | 점진적 강제 |
|---|---|---|---|
ios/p12-opens | iOS | iOS .p12은 제공된 비밀번호로 열립니다. | — |
ios/p12-expiry | iOS | iOS 인증서가 만료되지 않았습니다. | — |
ios/profile-expiry | iOS | 배포 프로파일이 만료되지 않았습니다. | — |
ios/profile-bundle-match | iOS | 앱의 Bundle ID와 일치하는 배포 프로파일이 있습니다. | — |
ios/profile-type-vs-mode | iOS | 앱 스토어 / 어드혹 모드와 일치하는 프로파일 타입이 있습니다. | — |
ios/cert-profile-pairing | iOS | 배포 프로파일에 인증서가 포함되어 있습니다. | — |
ios/targets-covered | iOS | 모든 iOS 대상에 배포 프로파일이 있습니다. | — |
ios/infoplist-sanity | iOS | Info.plist에 필요 version / identity 키가 있습니다. | — |
ios/asc-key-valid | iOS | App Store Connect API 키 필드는 유효합니다. | — |
ios/asc-key-access | iOS | ASC API 키는 앱에 접근할 수 있습니다 (remote) | — |
ios/plist-bundle-id-format | iOS | CFBundleIdentifier 형식은 유효합니다. | Yes |
ios/plist-version-short-format | iOS | CFBundleShortVersionString 형식은 유효합니다. | Yes |
ios/plist-version-build-format | iOS | CFBundleVersion 형식이 유효합니다. | 네 |
ios/plist-encryption-compliance | iOS | ITSAppUsesNonExemptEncryption이 선언되었습니다. | 네 |
ios/plist-ats-arbitrary-loads | iOS | NSAllowsArbitraryLoads는 프로덕션에서 비활성화되었습니다. | 네 |
ios/plist-launch-storyboard | iOS | 시작 화면이 선언되었습니다. | 네 |
ios/plist-orientations-multitasking | iOS | 설정 / 멀티태스킹 설정은 일관적입니다. | 네 |
ios/plist-orientations-present | iOS | UISupportedInterfaceOrientations이 선언되었습니다. | 네 |
ios/plist-display-name | iOS | 표시 이름이 설정되었습니다. | 네 |
ios/plist-background-modes-sanity | iOS | UIBackgroundModes의 값이 유효합니다. | 네 |
ios/xcode-deployment-target-capacitor | iOS | Capacitor iOS 배포 대상이 요구 사항을 충족합니다. | 네 |
ios/xcode-signing-team | iOS | 인증 팀이 설정되었습니다 | 네 |
ios/xcode-bundle-id-mismatch-across-configs | iOS | Xcode 구성에서 Bundle id가 일관적입니다 | 네 |
ios/xcode-enable-bitcode-leftover | iOS | ENABLE_BITCODE이 남아 있지 않습니다 | 네 |
ios/xcode-swift-version-sanity | iOS | Swift 버전 설정이 정상적입니다. | Yes |
ios/xcode-no-app-target | iOS | iOS | Yes |
ios/xcode-multiple-app-targets | iOS | Xcode 프로젝트에 애플리케이션 목표가 있습니다. | Yes |
ios/entitlements-vs-profile-capability | iOS | 다중 앱 목표는 의도적으로 처리됩니다. | Yes |
ios/entitlements-aps-environment-vs-mode | iOS | APS 환경이 배포 모드와 일치합니다. | 네 |
ios/entitlements-associated-domains-format | iOS | Associated Domains 형식이 유효합니다. | 네 |
ios/entitlements-app-groups-format | iOS | App Groups 형식이 유효합니다. | 네 |
ios/capacitor-server-url-shipped | iOS | 서버 URL은 스토어 빌드용으로 라이브 리로드 / 원격 셸 엔드포인트로 남겨지지 않습니다. | 네 |
ios/capacitor-server-cleartext | iOS | 생산 환경에서 server.cleartext 가 비활성화되어 있습니다. | 네 |
ios/capacitor-allow-navigation-wildcard | iOS | server.allowNavigation 은 전체적인 wildcard가 아닙니다. | 네 |
ios/pods-not-installed | iOS | CocoaPods Pods / workspace는 Pods를 사용할 때 존재합니다. | 네 |
ios/pods-lock-missing | iOS | Podfile.lock는 pod 버전을 고정합니다. | 네 |
ios/pods-capacitor-missing | iOS | Podfile wires Capacitor | 네 |
ios/spm-package-resolved-missing | iOS | SPM Package.resolved이 존재합니다 | 네 |
ios/spm-capacitor-dependency-missing | iOS | Package.swift에서 Capacitor이 선언됩니다 | 네 |
ios/appicon-empty-or-placeholder | iOS | AppIcon.appiconset이 존재하고 비어있지 않습니다 | 네 |
ios/appicon-referenced-file-missing | iOS | 디스크에 Contents.json 아이콘 파일이 존재합니다. | 네 |
ios/appicon-marketing-missing | iOS | 1024×1024 마케팅 아이콘 존재 | 네 |
ios/spm-deployment-target-consistency | iOS | SPM 배포 대상이 일관적입니다. | 네 |
안드로이드
안드로이드| ID | 플랫폼 | 체크하는 내용 | 점진적 강제 |
|---|---|---|---|
android/keystore-opens | 안드로이드 | 안드로이드 키스토어는 제공된 비밀번호로 열립니다 | — |
android/keystore-expiry | 안드로이드 | 안드로이드 인증서가 만료되지 않았습니다 | — |
android/cordova-vars-present | 안드로이드 | cordova.variables.gradle은 cap sync 후 존재합니다 | — |
android/gradle-props-heuristics | 안드로이드 | gradle.properties는 일반적인 빌드 중단에 대한 힌트입니다 | — |
android/play-sa-json | 안드로이드 | 서비스 계정 JSON이 구성되면 존재합니다. | — |
android/flavor-exists | 안드로이드 | 구성된 서비스 계정 JSON이 존재합니다. | — |
android/agp8-package-attr | 안드로이드 | 요청된 제품 맛집이 존재합니다. | — |
android/manifest-well-formed | 안드로이드 | AGP 8+에서 Manifest package= 속성이 제거되었습니다. | — |
android/manifest-tag-typo | 안드로이드 | AndroidManifest.xml이 파싱됩니다. | — |
android/manifest-namespace-uri | 안드로이드 | 일반적인 매니페스트 태그 오류 | — |
android/manifest-missing-prefix | 안드로이드 | 안드로이드 속성은 android: 접두사를 사용합니다. | — |
android/manifest-exported-missing | 안드로이드 | 안드로이드:exported는 필요할 때 설정됩니다. | — |
android/manifest-multiple-uses-sdk | 안드로이드 | 사용하는 sdk 요소는 하나만 사용됩니다. | — |
android/manifest-duplicate-component | 안드로이드 | 중복된 컴포넌트는 없습니다. | — |
android/manifest-unique-permission | 안드로이드 | 사용자 정의 권한은 고유합니다. | — |
android/manifest-hardcoded-debuggable | 안드로이드 | debuggable=true는 배포되지 않습니다. | — |
android/manifest-mock-location | 안드로이드 | ACCESS_MOCK_LOCATION not shipped | — |
android/manifest-exported-unprotected | 안드로이드 | 수출된 컴포넌트는 보호됩니다. | — |
android/manifest-query-all-packages | 안드로이드 | Exported components are protected | — |
android/manifest-deeplink-valid | 안드로이드 | QUERY_ALL_PACKAGES 정당성 | — |
android/applicationid-present | 안드로이드 | 디플링크 인텐트 필터가 유효합니다. | — |
android/capacitor-build-gradle-applied | 안드로이드 | capacitor.build.gradle이 적용되었을 때 존재합니다. | — |
android/gradle-wrapper-present | 안드로이드 | Gradle wrapper 파일이 존재합니다. | — |
android/flavor-dimensions | 안드로이드 | 플레이 스토어에서 요구하는 SDK 버전을 충족합니다. | — |
android/google-services-file | 안드로이드 | 플레이어 서비스 JSON 파일이 플러그인이 적용되었을 때 존재합니다. | — |
android/local-properties-committed | 안드로이드 | 로컬 속성 파일에 비밀을 포함하지 않습니다. | — |
android/sdk-floors | 안드로이드 | SDK 목적지의 min/compile/target 층이 유효합니다. | — |
android/target-sdk-play | 안드로이드 | 플레이 스토어에서 요구하는 SDK 버전을 충족합니다. | — |
android/min-sdk-capacitor | 안드로이드 | minSdk가 Capacitor 요구 사항을 충족합니다. | — |
android/version-fields | 안드로이드 | 버전 코드 / 버전 이름이 존재합니다. | — |
android/play-sa-access | 안드로이드 | 앱에 접근할 수 있는 플레이 서비스 계정 | — |
예시: remote Next.js / server.url shell
원격 Next.js / server.url shell 예시운영 환경에서 네이티브 쉘을 로드하는 것은 __CAPGO_KEEP_0__ 지원 패턴입니다. server.url Capgo는 지원하는 Capacitor 패턴입니다. Prescan 플래그 ios/capacitor-server-url-shipped 다른 체크를 비활성화하지 않고도 이를 인식합니다:
터미널 창
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