App Store
Uploading iOS builds to TestFlight and submitting them to App Review: the account, the files the binary must carry, and the App Store Connect fields that get checked. Read it before your first iOS upload, and before each submission.
How it works
Binary validation (step 3) is automatic and fast. It rejects missing plist keys, missing privacy-manifest reasons and an outdated SDK before any human looks.
How to build it
The account
- The Apple Developer account belongs to the client's legal entity, with the client's person as Account Holder. Only the Account Holder can accept agreements.
- Membership, agreements, tax and bank details take days. Start them at kickoff.
- One App Store Connect record per flavor. Only prod is ever submitted.
What the binary must carry
| Item | Why |
|---|---|
PrivacyInfo.xcprivacy | Declares data collected, tracking domains, and required-reason APIs (UserDefaults, file timestamps, and others). Builds without valid reasons are rejected (ITMS-91053). Plugins that ship no manifest leave this to you |
ITSAppUsesNonExemptEncryption = false | Skips the export-compliance question on every upload, if you only use standard HTTPS |
| A usage string for every permission API linked | A plugin that links the "always" location API needs NSLocationAlwaysAndWhenInUseUsageDescription even if you never call it |
NSUserTrackingUsageDescription | Required before showing the tracking prompt; the request crashes without it |
NSMicrophoneUsageDescription, camera, contacts | Ask at the moment of use, and handle "denied" with a path to Settings |
| Associated domains, App Attest, push entitlements | Enabled on the App ID and in the profile |
Scene lifecycle (UIApplicationSceneManifest) | Newer iOS versions require it. Disabling it to work around a plugin crashed every launch on a new iOS |
| All iPad orientations | Required for iPad multitasking. UIRequiresFullScreen is deprecated |
Sign in with Apple
If the app offers any third-party sign-in (Google, Microsoft), it must also offer Sign in
with Apple (Guideline 4.8), shown no less prominently. We put it first on iOS. Setup
needs a primary App ID, a separate Services ID, and a .p8 key; paste the key exactly,
because stray whitespace breaks it.
App Store Connect fields that reviewers check
- App Privacy labels match the privacy manifest and the policy.
- Age rating matches the terms and the Play target audience.
- Support URL and privacy policy URL load. A 404 is a rejection.
- Review notes explain anything non-obvious: where AI is used and how consent works, how moderation works, what is behind sign-in.
- Demo account works for the whole review. See Getting through review.
Rules
Archive with the current Xcode and SDK. App Store Connect raises the minimum SDK each year, and an outdated Xcode simply cannot upload.
Test the exact build you submit on TestFlight, on an iPad as well as an iPhone. Apple often reviews on an iPad, and our rejections included iPad-only failures.
After any change to plugins or the dependency manager, run a full Release archive before release day. Debug builds hide build-phase and signing failures.
Mistakes we made
- Every launch crashed on a new iOS version. The scene manifest key had been renamed months earlier to work around a plugin crash. A new iOS made the scene lifecycle mandatory. Fix the plugin; do not disable the platform feature.
- A new Xcode refused to archive. Some pods declared a deployment target below the new minimum. A Podfile hook now clamps every pod's target.
- A TestFlight upload failed because Xcode was outdated and needed its licence accepted on the build machine.
- The privacy manifest had an undeclared analytics domain, because that SDK ships no manifest. Check every SDK's network domains, not only the ones with manifests.
- Sign in with Apple was rejected by the auth library on a valid credential. We exchanged the token through the identity provider's REST API instead.
Checklist
- Account Holder, agreements, tax and bank done.
- Privacy manifest with every required reason and tracking domain.
- Usage strings for every permission API linked by any plugin.
- Encryption flag set.
- Scene lifecycle on; all iPad orientations declared.
- Sign in with Apple offered if any other social sign-in is.
- App Privacy, age rating, URLs and review notes match this build.
- Release archive tested on TestFlight on iPhone and iPad.