# Workflow: Ship iOS App **Read NOW:** 1. references/app-store.md 2. references/ci-cd.md ## Step 1: Pre-Release Checklist - [ ] Version/build numbers updated - [ ] No debug code or test data - [ ] Privacy manifest complete (PrivacyInfo.xcprivacy) - [ ] App icons all sizes (see references/app-icons.md) - [ ] Screenshots prepared - [ ] Release notes written ## Step 2: Archive ```bash xcodebuild archive \ -project AppName.xcodeproj \ -scheme AppName \ -archivePath ./build/AppName.xcarchive \ -destination 'generic/platform=iOS' ``` ## Step 3: Export for Distribution **For TestFlight/App Store:** ```bash xcodebuild -exportArchive \ -archivePath ./build/AppName.xcarchive \ -exportPath ./build/export \ -exportOptionsPlist ExportOptions.plist ``` ExportOptions.plist: ```xml method app-store-connect signingStyle automatic ``` ## Step 4: Upload to App Store Connect ```bash xcrun altool --upload-app \ -f ./build/export/AppName.ipa \ -t ios \ --apiKey YOUR_KEY_ID \ --apiIssuer YOUR_ISSUER_ID ``` Or use `xcrun notarytool` with App Store Connect API. ## Step 5: TestFlight 1. Wait for processing in App Store Connect 2. Add testers (internal or external) 3. Gather feedback 4. Iterate ## Step 6: App Store Submission In App Store Connect: 1. Complete app metadata 2. Add screenshots for all device sizes 3. Set pricing 4. Submit for review ## Step 7: Post-Release - Monitor crash reports - Respond to reviews - Plan next version Required since iOS 17. Create `PrivacyInfo.xcprivacy`: ```xml NSPrivacyTracking NSPrivacyCollectedDataTypes NSPrivacyAccessedAPITypes NSPrivacyAccessedAPIType NSPrivacyAccessedAPICategoryUserDefaults NSPrivacyAccessedAPITypeReasons CA92.1 ``` | Reason | Fix | |--------|-----| | Crash on launch | Test on real device, check entitlements | | Missing privacy descriptions | Add all NS*UsageDescription keys | | Broken links | Verify all URLs work | | Incomplete metadata | Fill all required fields | | Guideline 4.3 (spam) | Differentiate from existing apps |