Jetpack 81 · iPhone & iPad

Release Manual

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.

Part 1 · once

Set up TestFlight with Xcode

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.

In Xcode

1

Sign in with the right Apple Account

Where: Xcode menu → Settings… (⌘ ,) → Accounts

Accounts
GeneralAccountsBehaviorsNavigationThemesText Editing
Yyou@example.comApple Account
+−
you@example.com
Team
Your TeamIndividual
Download Manual ProfilesManage Certificates…
1Tab
Accounts
2Apple Account
The one that owns your developer team
3Team
Your developer team is listed
4Account missing?
Click + → Apple Account → sign in

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
Portrait Upside Down Landscape Left Landscape 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

Jetpack81 › Any iOS Device (arm64)
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 App Validate 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
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.
1Organizer status
Uploaded

In App Store Connect

9

Wait for processing

Where: App Store Connect → Apps → Jetpack 81 → TestFlight

appstoreconnect.apple.com
Jetpack 81
DistributionTestFlightXcode Cloud
Builds
iOS
Internal Testing+
External Testing+
Version 1.0 · BuildStatus
1Processing
1Tab
TestFlight
2Build
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+
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
  1. Play the change on your Mac

    make run
  2. 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.

  3. 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.

  4. Wait for Apple's “completed processing” email

    Usually 10 to 30 minutes. With automatic distribution on, the build reaches your group by itself.

  5. Update in TestFlight on your iPhone

    Open TestFlight and tap Update.

  6. 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:

python3 ios/bundle_assets.py --list | grep your-file-name

Added a .c file and the iPhone build says Undefined symbol

Add the file under sources in ios/project.yml, then regenerate the Xcode project:

make ios-project

New Mac, or a fresh copy of the code

Downloads the pinned raylib-iOS library and generates the Xcode project:

make ios-setup

Optional: let Claude drive the simulator itself

Asks for your Mac password, so only you can run it:

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

Part 4

Spend fewer credits

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

Part 5

Could do next

None of these are needed for TestFlight.

Welcome · ready to play
0:00 / 0:29