Set up TestFlight with Xcode one screen at a time, then ship every update with one command. Each step shows the screen you'll see, the exact settings, and what to click.
Ready The iPhone build runs in the simulator, with touch controls and audio.
Ready Signing, app icon and privacy files are set up for your team.
To do Steps 4 to 12 below: first upload, then TestFlight on your iPhone.
The screens below are drawn replicas using Xcode 26.4's own wording, not screenshots. Orange rings mark what to check or click, and the numbers match the settings list under each screen. Press Listen on any step and a cursor walks through it with the narration. App Store Connect's website changes more often, so its labels may differ slightly.
Warning icon or “Sign in again”? Click it and enter your password. The upload can't reach Apple until this is clear.
2
Check Signing & Capabilities
Where: open ios/Jetpack81.xcodeproj → blue Jetpack81 icon at the top of the left sidebar → TARGETS → Jetpack81 → Signing & Capabilities
open ~/Appstorius_projects/01_Games/zxclones/jetpack/ios/Jetpack81.xcodeproj
Jetpack81 › iPhone 17 Pro
Project
Jetpack81
Targets
Jetpack81
GeneralSigning & CapabilitiesInfoBuild Settings
Signing
Automatically manage signing
Your Team
com.appstorius.jetpack81
Xcode Managed Profile
Apple Development
1Sidebar
Blue Jetpack81 project icon
2Target
TARGETS → Jetpack81
3Tab
Signing & Capabilities
4Automatically manage signing
Ticked
5Team
Your developer team
6Bundle Identifier
com.appstorius.jetpack81
7Signing Certificate
Apple Development
Look, don't edit. These settings come from ios/project.yml. The upload script regenerates the Xcode project every run, which replaces anything changed here. To change a setting, edit that file or ask Claude.
3
Check the General tab
Where: same target, the General tab just left of Signing & Capabilities
GeneralSigning & CapabilitiesInfoBuild Settings
Minimum Deployments
15.6
Identity
Jetpack 81
com.appstorius.jetpack81
1.0
1
Deployment Info
PortraitUpside DownLandscape LeftLandscape Right
App Icons and Launch Screen
AppIcon
1Minimum Deployments
iOS 15.6
2Display Name
Jetpack 81
3Version
1.0
4Build
1 (later uploads use a date-and-time number)
5iPhone Orientation
Landscape Left and Landscape Right only
6App Icon
AppIcon (your JP81 artwork)
4
Archive the game
Where: the device picker at the top of the Xcode window, then the Product menu
XcodeFileEditViewNavigateProductDebugWindow
Jetpack81 ›Any iOS Device (arm64)
Run⌘R
Test⌘U
Profile⌘I
Analyze⇧⌘B
Archive
Build⌘B
Clean Build Folder…⇧⌘K
1Run destination
Any iOS Device (arm64)
2Menu
Product
3Command
Archive · takes 2 to 4 minutes
Archive greyed out? The destination is still a simulator. Pick Any iOS Device first. When the build finishes, the Organizer window opens by itself.
Upload
5
Pick the archive in Organizer
Where: Organizer opens after archiving. Otherwise choose Window → Organizer.
Organizer
Archives
Crashes
Energy
Launches
Feedback
NameCreation DateVersion
Jetpack 81Today, 09:141.0 (1)
Distribute AppValidate App
com.appstorius.jetpack81
Your Team
1Sidebar
Archives
2Archive
Jetpack 81 · 1.0 (1), the newest one
3Button
Distribute App
6
Choose App Store Connect
Select a method of distribution:
App Store ConnectUse recommended settings to upload app to App Store Connect for testing and release.
TestFlight Internal OnlyUse recommended settings to distribute for internal testing with TestFlight.
Release TestingUse recommended settings to ad hoc distribute to registered devices.
DebuggingUse recommended settings to distribute with development signing to registered devices.
CancelDistribute
1Method
App Store Connect
2Button
Distribute
Why not TestFlight Internal Only? It works, but those builds can never go to outside testers or the App Store.
7
Create the app record
When: only on the very first upload. Later uploads skip this screen.
Your app must be registered with App Store Connect before it can be uploaded. Xcode will create an app record with the following properties.
Jetpack 81
English (U.K.)
com.appstorius.jetpack81
jetpack81
CancelPreviousNext
1Name
Jetpack 81 · must be unique on the App Store, so add a word if it's taken
2Primary Language
English (U.K.)
Bundle Identifier
com.appstorius.jetpack81 · filled in for you
3SKU
jetpack81 · a private code only you see
4Button
Next
Xcode says “A team's first app record must be created on App Store Connect”?
Then create it on the website instead: App Store Connect → Apps → + → New App. Afterwards, go back to step 5 and click Distribute App again.
appstoreconnect.apple.com/apps
New App
iOSmacOStvOSvisionOS
Jetpack 81
English (U.K.)
com.appstorius.jetpack81
jetpack81
Limited AccessFull Access
CancelCreate
1Platforms
iOS only
2Name
Jetpack 81
3Primary Language
English (U.K.)
4Bundle ID
com.appstorius.jetpack81
5SKU
jetpack81
6User Access
Full Access
7Button
Create
Bundle ID not in the list? Register it first: Certificates, Identifiers & Profiles → Identifiers → + → App IDs → App. Use description Jetpack 81 and Explicit bundle ID com.appstorius.jetpack81.
8
Let it upload
Uploading
Xcode signs the app for distribution, then sends it to Apple. When it reports the upload finished, click Done.
NameVersionStatus
Jetpack 811.0 (1)Uploaded
Afterwards, the archive's status in Organizer reads Uploaded.
1.0 (1) shows Processing, usually for 10 to 30 minutes. Apple emails you when it's ready.
No encryption question. The app already declares that it uses no non-exempt encryption, so the build won't stop at “Missing Compliance”.
10
Create an internal testing group
Where: TestFlight tab → left sidebar → + next to Internal Testing
appstoreconnect.apple.com
Internal Testing+
Create a New Internal Group
Me
Enable automatic distribution
CancelCreate
1Sidebar
+ next to Internal Testing
2Group Name
Anything, for example Me
3Enable automatic distribution
Ticked · every new build reaches you automatically
4Button
Create
11
Add yourself as a tester
Where: inside the new group
appstoreconnect.apple.com
Me
Testers+
You · you@example.com
Builds+
Version 1.0 (1)
1Testers
+ → tick yourself → Add
2Builds
1.0 (1) appears by itself. If not, click + next to Builds and pick it.
On your iPhone
12
Install it with TestFlight
Where: Apple's free TestFlight app from the App Store, signed in with the same Apple Account
TestFlight
Jetpack 81Version 1.0 (1)
INSTALL
1Button
Install, then Open
Invite email
You can also tap View in TestFlight in the invitation email
Done. From now on, new builds appear in TestFlight as updates. Part 2 covers how to send them.
Part 2 · every update
Ship a new build
After Part 1, updates skip Organizer entirely. Run these in Terminal from the game folder:
cd ~/Appstorius_projects/01_Games/zxclones/jetpack
Play the change on your Mac
make run
Try it in the iPhone simulator
open ios/Jetpack81.xcodeproj
Pick an iPhone at the top of Xcode and press ⌘R. Mouse clicks act as finger taps.
Upload to TestFlight
make ios-testflight
Builds, signs and uploads in a few minutes. The build number is the UTC date and time, such as 202609240723, so it always goes up.
Wait for Apple's “completed processing” email
Usually 10 to 30 minutes. With automatic distribution on, the build reaches your group by itself.
Update in TestFlight on your iPhone
Open TestFlight and tap Update.
Save your work
Commit with git. Check git status first: dist/ and Jetpack 81 Test.app aren't ignored yet, so add files by name. Back up now and then:
cd .. && ditto -c -k --keepParent jetpack "jetpack-backups/jetpack-backup-$(date +%Y-%m-%d-%H%M).zip" && cd jetpack
New version number? In ios/project.yml, change MARKETING_VERSION: "1.0" to "1.1". Build numbers still take care of themselves.
Part 3
When something breaks
Check here before asking Claude. Each of these has a known fix.
Upload says Error Downloading App Information
App Store Connect has no app record yet, or your Xcode login expired. Do steps 4 to 8 above, or sign in again (step 1). Xcode's detailed log names the real reason:
open "$(ls -dt $TMPDIR/Jetpack81_*.xcdistributionlogs | head -1)"
First upload fails with DistributionAppRecordProviderError error 0
Xcode created the app record, but Apple's servers hadn't listed it yet when Xcode checked a few seconds later. Wait a few minutes, then upload again from Organizer or with make ios-testflight.
Upload succeeds with Upload Symbols Failed for libEGL or libGLESv2
Harmless. The prebuilt graphics libraries ship without debug symbols, so crash reports won't show detail inside them. Your own code's symbols still upload.
Signing fails with No Account for Team
Sign in to your developer Apple Account under Xcode → Settings → Accounts (step 1).
Apple emails ITMS-91053: Missing API declaration
Paste the email into Claude. It's a short addition to the app's privacy file.
New art or sound works on the Mac but not on the iPhone
Only files whose path appears in the game's code are packed into the app. Check that yours is listed:
Use Claude for the thinking, not the button presses.
Do it yourself · free
Build and play: make run
Run the iPhone simulator
Upload: make ios-testflight
Manage testers in App Store Connect
Bump the version number
Read Apple's processing emails
Make backups
Ask Claude
Code changes and new features
Bug fixes and gameplay tuning
Errors this page doesn't cover
App Store submission prep
Paste the error, not the log.Add this to a command to keep only the last 25 lines. The build log pasted earlier ran to thousands of lines, and Claude reads every one.
make ios-testflight 2>&1 | tail -25
Start a fresh session when you switch topics.A long session sends its whole history with every new message.
Be specific.Name the level, the file or the behaviour:
“In the lab, the jump button feels too slow on iPhone.”
Group small tweaks into one messageinstead of five separate ones.
Match the model to the job.A lighter model or lower effort for small edits; the strongest settings for tricky bugs.
Ask for a short plan first on big features,so you can change direction before the work is done.
Part 5
Could do next
None of these are needed for TestFlight.
Shrink the texturesSome sprite sheets are far larger than the game draws them. Smaller art means a smaller download and less memory on older iPhones.
Try it on an iPadThe game already runs on iPad, but nobody has played it on one yet.
Invite external testersApple reviews the first external build, usually within a day or two.
App Store screenshots and textFor when you're ready to release publicly.
Commit the iOS work to gitNone of it is committed yet.
Game controller supportWorks well on iPhone and iPad, and Steam Deck needs it anyway.