Skip to main content

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​

ItemWhy
PrivacyInfo.xcprivacyDeclares 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 = falseSkips the export-compliance question on every upload, if you only use standard HTTPS
A usage string for every permission API linkedA plugin that links the "always" location API needs NSLocationAlwaysAndWhenInUseUsageDescription even if you never call it
NSUserTrackingUsageDescriptionRequired before showing the tracking prompt; the request crashes without it
NSMicrophoneUsageDescription, camera, contactsAsk at the moment of use, and handle "denied" with a path to Settings
Associated domains, App Attest, push entitlementsEnabled 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 orientationsRequired 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​

Rule

Archive with the current Xcode and SDK. App Store Connect raises the minimum SDK each year, and an outdated Xcode simply cannot upload.

Rule

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.

Rule

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.