Entry point:
AGENTS.md
This guide sets up Xcode Cloud to archive Closed Captioner on push to main and upload directly to App Store Connect for App Store review — no TestFlight.
| Path | Purpose |
|---|---|
ci_scripts/ci_post_clone.sh |
Runs after git clone (no extra deps for this project) |
ci_scripts/ci_pre_xcodebuild.sh |
Sets CFBundleVersion from CI_BUILD_NUMBER (required for repeat uploads) |
ClosedCaptioner.xcodeproj/xcshareddata/xcschemes/ClosedCaptioner.xcscheme |
Shared scheme — required for Xcode Cloud |
| Item | Cost |
|---|---|
| Apple Developer Program | $99/year (required) |
| Xcode Cloud | 25 compute hours/month free, then paid tiers if exceeded |
| App Store submission | $0 per version |
For a solo app with releases a few times per month, you will likely stay within the free tier.
Complete these before creating the workflow in Xcode.
RaveSociety.ClosedCaptionerclosed-captioner-001PrivacyPolicy.md at a public URLkbibireddy.github.io URL (required for AdMob app-ads.txt — see app-ads-txt.md)PrivacyPolicy.md §20: Audio Data (no tracking); Device ID + Advertising Data (Used for Tracking = Yes via AdMob/ATT)https://github.com/kbibireddy/closed-captioner.gitmainci_scripts/, shared scheme)66R936J3XS) has App Store Connect accessThese steps are done in the Xcode UI — they cannot be fully defined in git.
Note: In Xcode 15+ (including Xcode 26), Product → Xcode Cloud may not appear. Use the Report navigator path below instead.
ClosedCaptioner.xcodeproj in Xcode on your Mac.kbibireddy/closed-captioner.Alternative paths if Cloud tab is empty:
+ button (bottom-left) → Create WorkflowIf GitHub is not connected:
Use these recommended settings:
| Setting | Value |
|---|---|
| Name | App Store Release |
| Repository | kbibireddy/closed-captioner |
| Project/Workspace | ClosedCaptioner.xcodeproj |
| Primary branch | main |
| Setting | Value |
|---|---|
| Trigger | On push to main |
| Files and folders (optional) | Leave empty to build on any push, or limit to ClosedCaptioner/** to skip doc-only changes |
| Setting | Value |
|---|---|
| Xcode version | Latest Release (or match local, e.g. 26.x) |
| macOS version | Default |
| Action | Setting |
|---|---|
| Archive | Scheme: ClosedCaptioner, Platform: iOS, Configuration: Release |
Use one post-action only:
| Post-action | Setting | Result |
|---|---|---|
| App Store Connect | Prepare for Submission | Uploads build and attaches it to the matching App Store version; you submit for review in ASC (or it waits until metadata is complete) |
| App Store Connect | Submit for Review | Fully automatic — submits to App Review when the App Store version metadata is complete |
Do not add TestFlight Internal or External Testing post-actions if you want to skip TestFlight entirely.
Recommendation: Start with Prepare for Submission until your first App Store version is fully configured. Switch to Submit for Review once screenshots, privacy URL, and App Privacy are done.
Requirements for automatic App Store pickup:
1.1 in both places)ITSAppUsesNonExemptEncryption = false in Info.plist (already in repo — avoids export compliance blocking)Xcode Cloud manages distribution certificates and App Store provisioning profiles for you when:
66R936J3XS is selectedOn first workflow run, approve any certificate/profile creation prompts in Xcode or App Store Connect.
Xcode may offer to commit the workflow definition. If prompted, allow it so workflow metadata is tracked in git.
main to trigger automaticallyMonitor builds at App Store Connect → Xcode Cloud or in Xcode’s Report navigator → Cloud tab.
mainflowchart LR
A[Push to main] --> B[Xcode Cloud clone]
B --> C[ci_post_clone.sh]
C --> D[ci_pre_xcodebuild.sh sets build number]
D --> E[Archive Release]
E --> F[Upload to App Store Connect]
F --> G[Attach to App Store version]
G --> H[Submit for Review optional]
H --> I[Live on App Store after approval]
ci_post_clone.sh runsci_pre_xcodebuild.sh sets build number to CI_BUILD_NUMBERTestFlight is not used. Builds go straight to the App Store pipeline.
If your workflow already has TestFlight post-actions:
Or in App Store Connect → Xcode Cloud → Manage Workflows → edit the same settings.
| Symptom | Likely cause | Fix |
|---|---|---|
| No Product → Xcode Cloud menu | Removed/moved in Xcode 15+ | Use Report navigator → Cloud → Get Started |
| Cloud tab missing or greyed out | Not signed into Apple ID, or no eligible team | Xcode → Settings → Accounts → add Apple ID with team RaveSociety |
| Workflow not offered in Xcode | No shared scheme / not pushed | Ensure xcshareddata/xcschemes/ClosedCaptioner.xcscheme is committed |
| GitHub access denied | Xcode Cloud not authorized | Re-link GitHub in ASC Integrations or Xcode Accounts |
| Duplicate build number | ci_pre_xcodebuild.sh not running |
Confirm ci_scripts/ is at repo root; scripts are executable |
| Signing failed | Bundle ID / team mismatch | Verify RaveSociety.ClosedCaptioner and team 66R936J3XS |
| Build succeeds, build not on App Store version | Wrong post-action or version mismatch | Remove TestFlight actions; add App Store Connect post-action; ensure ASC version matches MARKETING_VERSION |
| Prepare Build for App Store Connect failed after a successful archive | Marketing version already Ready for Distribution / released (e.g. 1.1 closed; Cloud tried to upload 1.1 again) | Bump MARKETING_VERSION in project.pbxproj, create a matching iOS version in ASC, commit and push to main |
| Build stuck on export compliance | Encryption prompt | ITSAppUsesNonExemptEncryption = false in Info.plist (done); clear Build 7 once in ASC |
| App Store submit blocked | Incomplete listing | Add screenshots, privacy URL, App Privacy answers |
| Archive fails on speech/mic APIs | Missing usage descriptions | Already set in project — do not remove INFOPLIST_KEY_NSMicrophoneUsageDescription / NSSpeechRecognitionUsageDescription |
| Field | Where | Rule |
|---|---|---|
Marketing version (e.g. 1.0) |
MARKETING_VERSION in Xcode |
Bump manually for feature releases |
| Build number | Set by ci_pre_xcodebuild.sh |
Auto-incremented per Xcode Cloud build via CI_BUILD_NUMBER |
Before a major release, bump MARKETING_VERSION in ClosedCaptioner.xcodeproj and commit to main.
| Doc | Path |
|---|---|
| Agent index | AGENTS.md |
| Local device deploy | device-deploy.md |
| Privacy policy text | PrivacyPolicy.md |