@capgo/capgo-skills
Version:
55 agent skills for Capacitor mobile development
72 lines (53 loc) • 4.18 kB
Markdown
# iOS Submission (App Store Connect)
## Prerequisites
- Apple Developer Program membership (organization accounts for regulated categories such as banking, VPN, crypto exchange, health records).
- App record created in App Store Connect with the exact bundle ID from `capacitor.config.*` `appId` / Xcode `PRODUCT_BUNDLE_IDENTIFIER`.
- Xcode 26+ today; Xcode 27 required for uploads from April 2027. Capacitor 8.5+ is needed to build with Xcode 27 (UIScene lifecycle).
- iOS project path: `ios/App/App.xcodeproj` (SPM, default for new projects) or `ios/App/App.xcworkspace` (CocoaPods). Always open the workspace if it exists.
## Signing
- Simplest: Xcode -> App target -> Signing & Capabilities -> Automatically manage signing, Team selected.
- CI: App Store Connect API key (`.p8`, key ID, issuer ID) with `-allowProvisioningUpdates`, or manual distribution certificate + App Store provisioning profile. See `capacitor-ci-cd`.
- Every capability enabled in Signing & Capabilities becomes an entitlement. Remove unused ones (Push, Associated Domains, iCloud) before submission; unused entitlements are a review risk.
## Archive and upload
Pick one:
1. Xcode: Product -> Archive -> Organizer -> Validate App -> Distribute App -> App Store Connect.
2. CLI:
```bash
cd ios/App
xcodebuild -scheme App -configuration Release \
-destination 'generic/platform=iOS' \
-archivePath build/App.xcarchive archive
# add -workspace App.xcworkspace for CocoaPods projects
xcodebuild -exportArchive -archivePath build/App.xcarchive \
-exportOptionsPlist ExportOptions.plist -exportPath build
xcrun altool --upload-app --type ios --file build/App.ipa \
--apiKey "$ASC_KEY_ID" --apiIssuer "$ASC_ISSUER_ID"
```
`ExportOptions.plist` needs `method` = `app-store-connect` (Xcode 15.3+ name; `app-store` still accepted) and your `teamID`. Setting `destination` = `upload` makes `-exportArchive` upload directly.
3. `npx cap build ios` (wraps `xcodebuild` archive/export; supports `--scheme`, `--configuration`, `--xcode-team-id`).
4. Transporter app, Fastlane `pilot`/`deliver`, or Capgo Cloud Build (`capgo-native-builds`).
## Info.plist and privacy
- Every permission a plugin can trigger needs a usage string, even if your code path rarely runs. Missing ones fail upload (ITMS-90683) or crash at runtime.
- Write specific purposes ("Scan receipts to attach them to expenses"), not "This app needs camera access".
- `ITSAppUsesNonExemptEncryption` = `false` skips the export compliance question when you only use HTTPS/OS crypto. Set `true` and answer the questionnaire if you ship custom crypto.
- `NSUserTrackingUsageDescription` only if you call App Tracking Transparency; requesting ATT without tracking is a rejection risk.
- `PrivacyInfo.xcprivacy` in the App target (Copy Bundle Resources): declare required-reason APIs used by your own code and plugins without manifests (`UserDefaults` -> `CA92.1` is common because Capacitor Preferences uses it). App Privacy answers in App Store Connect must cover all collected data, including third-party SDKs.
## App Store Connect fields
| Field | Limit / rule |
|---|---|
| Name | 30 characters |
| Subtitle | 30 characters |
| Promotional text | 170 characters, editable without review |
| Description | 4000 characters |
| Keywords | 100 bytes, comma-separated, no spaces needed |
| What's New | required for updates |
| Support URL | required; Privacy Policy URL required for all apps |
| Age rating | new questionnaire (4+, 9+, 13+, 16+, 18+) |
## TestFlight
- Internal testers (up to 100 team members) get builds after processing, no review.
- External testers (up to 10,000) need Beta App Review for the first build of a version.
- Builds expire after 90 days.
## Review submission
- Demo account with working credentials (or demo mode) in App Review Information; backend must be live.
- Review notes: explain non-obvious features, hardware requirements, and live update usage (Capgo updates only change web assets; native code changes still go through review).
- Phased release for automatic updates: 7-day rollout (1%, 2%, 5%, 10%, 20%, 50%, 100%), can be paused up to 30 days total; users can still update manually.