Ship a new version of your iOS app to TestFlight so your testers can try it. Bump the build number, archive, upload, wait for Apple's processing. About 10 minutes of your time + 5–30 minutes of Apple's. Walks through every tool you need to install.
First-time setup. Skip whichever you already have.
com.yourname.appname) and an app name.Apple rejects re-uploads with the same CFBundleVersion. Bump it before archiving.
In Xcode: click your project at the top of the file navigator → select the target → General → Identity. Two fields:
CFBundleShortVersionString) — the user-visible version. Keep the same for a patch; bump it (e.g., 1.2.0 → 1.2.1) when shipping real changes.CFBundleVersion) — increase by 1. Must always increase, even within the same Version.Or via terminal at the project root:
agvtool next-version -all
In the toolbar (top of Xcode), the device picker must say Any iOS Device (arm64) — not a simulator. Archiving only works against a generic device target.
Menu: Product → Destination → Any iOS Device (arm64).
In Xcode: menu Product → Archive. Xcode builds in Release mode (this takes a minute or two on a typical project), then opens the Organizer window with your archive listed.
Or via terminal:
xcodebuild -scheme YourAppScheme -configuration Release archive \
-archivePath ~/Desktop/YourApp.xcarchive
In Organizer (it opens automatically after Archive), select your archive on the left → click Validate App on the right.
This catches signing problems, entitlement mismatches, and bundle issues before you waste time on a failed upload. Validation takes ~1 minute. Fix anything it flags before continuing.
Option A — Xcode Organizer (easiest).
In Organizer: Distribute App → App Store Connect → Upload. The wizard signs and uploads. Typical time: 2–5 minutes.
Option B — Transporter app (most reliable).
Export an IPA first: in Organizer, Distribute App → App Store Connect → Export. Save the IPA file. Then open Transporter ↗, drag the IPA in, click Deliver.
Useful when Xcode's upload UI hangs (more common than it should be).
Option C — command line (for scripts / CI).
Needs an App Store Connect API key. Then:
xcrun altool --upload-app \
-f ~/Desktop/YourApp.ipa \
-t ios \
--apiKey "$ASC_KEY_ID" \
--apiIssuer "$ASC_ISSUER_ID"
Upload finishes fast (a few minutes). Apple's server-side processing takes longer:
Watch in App Store Connect ↗ → My Apps → your app → TestFlight tab. Build status flows: Uploading → Processing → Ready to Submit.
When status is Ready to Submit, you have two tester options:
In App Store Connect: TestFlight tab → click your build → toggle which groups can access it. Testers get a push notification in the TestFlight app.
Your testers also need the TestFlight app — TestFlight on the App Store ↗. Send them the link if they don't have it yet.
By default, testers see your build with no notes. You can add release notes in App Store Connect → TestFlight → your build → Test Details → What to Test. Testers see these in the TestFlight app when they update.
Keep notes short and concrete: "Fixed the crash on the settings screen. Try toggling dark mode." Vague notes get vague feedback.
.entitlements file isn't enabled on your provisioning profile. In developer.apple.com → Identifiers ↗, enable the capability on your App ID, then regenerate the profile.