Skip to content

Expert · Publishing to the stores and the web · topic 45 of 50 · 35 min

Publishing on the Apple App Store

Explanation

iOS apps must be built on a Mac with Xcode. Join the Apple Developer Program (US$99 per year), register a bundle ID, let Xcode manage signing, set version and build numbers, and run flutter build ipa. Upload with Xcode's Organizer or the Transporter app, test with TestFlight, complete the App Store Connect listing and privacy details, and submit for App Review. Common rejections are crashes, incomplete information and missing demo accounts.

What you need

  • A Mac with a recent Xcode (Apple only allows iOS builds on macOS). Cloud Mac services and some CI providers are alternatives if you do not own one.
  • An Apple Developer Program membership: US$99 per year at the time of writing (fee waivers exist for some non-profits and institutions). Individuals or organisations can enrol; organisations need a D-U-N-S number.
  • An iPhone for testing is strongly recommended in addition to the simulator.

Bundle ID and signing

In Xcode, open ios/Runner.xcworkspace (not the .xcodeproj). In the Runner target's Signing & Capabilities tab, choose your team and enable "Automatically manage signing"; Xcode creates the certificates and provisioning profiles for you. Set the bundle identifier to your final ID, matching the App ID you register in your developer account.

A certificate proves who you are; a provisioning profile says which app may run on which devices or be distributed through the App Store. Automatic signing handles both for most apps; manual signing is mostly needed for complex enterprise setups.

Build and upload

bash
flutter build ipa --obfuscate --split-debug-info=build/symbols
# creates an Xcode archive and an .ipa under build/ios/
Then upload with Xcode (Window > Organizer > Distribute App) or Apple's Transporter app.

The version name and build number come from pubspec.yaml (version: 1.0.0+1). Every upload must have a higher build number than earlier uploads of the same version.

TestFlight

After upload and automatic processing, a build appears in App Store Connect. TestFlight lets you install it on your own devices (internal testers, members of your App Store Connect team) and invite external testers by email or public link. The first build for external testers goes through a short beta review. Use TestFlight to catch crashes and gather feedback before release.

The App Store listing and privacy

  • App name, subtitle, description, keywords, category, screenshots for required device sizes, and a support URL.
  • A privacy policy URL and the App Privacy details ("privacy nutrition labels") describing data collected, including by SDKs like Firebase.
  • Apps and SDKs that use certain sensitive APIs must include a privacy manifest file (PrivacyInfo.xcprivacy) declaring the reasons; Flutter and popular plugins include theirs, but check your own native code.
  • Usage descriptions in Info.plist for every permission, such as NSCameraUsageDescription, written as a clear reason for the user.

App Review

Apple reviews every app and update against its App Review Guidelines. Many reviews finish within a day or two, but plan for more time. Common reasons for rejection, and their fixes:

Rejection reasonFix
The app crashes or has obvious bugsTest release builds on real devices; check crash logs
Reviewer cannot log inProvide a demo account in the review notes
Placeholder content, broken links, "coming soon" featuresRemove or finish them
Missing or vague permission explanationsWrite specific Info.plist usage descriptions
Privacy details do not match the appUpdate App Privacy answers and the privacy manifest
Digital goods sold without Apple's in-app purchaseFollow the payments rules in the guidelines (physical goods and services like food delivery differ)
Think of it like this: Publishing on the App Store is like getting a stall in a strict, premium mall: you pay a yearly rent (developer fee), your stall must use the mall's approved fittings (Xcode signing), a trial opening with invited guests comes first (TestFlight), and the mall inspector (App Review) checks everything against the rulebook before customers enter.

Common mistakes

  • Opening Runner.xcodeproj instead of Runner.xcworkspace, so CocoaPods dependencies are missing.
  • Reusing a build number: the upload is rejected.
  • Generic permission texts like "Needs camera": reviewers reject unclear reasons.
  • No demo account for a login-only app.

Need help?

Stuck on a word or an idea? Search this course, or every course, and jump straight to the explanation or a worked question.

Try:

Watch the lesson

Publishing on the Apple App Store · 1/6

Mac + Xcode + Developer Program

iOS apps must be built on a Mac with Xcode. Join the Apple Developer Program.

Prefer a video by a teacher? Find free videos on “flutter publish app store xcode testflight flutter build ipa app review” on YouTube ↗

In real life: Getting a clinic app approved

A clinic appointment app was rejected because the reviewer could not get past the OTP login. The developer added a demo phone number with a fixed test code (configured in Firebase Auth's test numbers) to the review notes, improved the camera usage description to "Used to upload photos of your prescriptions", and resubmitted. The app was approved the next day.

Practice (0/3 done)

Task 1 · Question

Can you build an iOS release on a Windows laptop with only Flutter installed?

Task 2 · Question

Your login-only app was rejected because the reviewer could not sign in. What should you add?

Task 3 · Practice

Write an iOS release checklist for one of your apps: bundle ID, signing team, version and build number, Info.plist usage descriptions for every permission (write them), privacy policy URL, App Privacy answers (including SDKs), TestFlight testers, demo account details, and screenshots needed. If you have a Mac, run flutter build ipa and upload to TestFlight.

Quick quiz

Question 1

1.What is the Apple Developer Program fee at the time of writing?

Question 2

2.Which Xcode file should you open for a Flutter iOS project?

Question 3

3.What is TestFlight for?

Question 4

4.Where do you explain why the app needs the camera on iOS?

Read more (free)

Open a question to see the answer and why. The first ones are this topic's own quiz, so try the quiz above before you peek.

What is the Apple Developer Program fee at the time of writing?

Answer: US$99 per year

Check Apple's site for current pricing and waivers.

Which Xcode file should you open for a Flutter iOS project?

Answer: ios/Runner.xcworkspace

The workspace includes CocoaPods dependencies.

What is TestFlight for?

Answer: Distributing beta builds to testers before release

Internal and external beta testing.

Where do you explain why the app needs the camera on iOS?

Answer: A usage description key in Info.plist

For example NSCameraUsageDescription.

Which command runs the release build on a connected phone?Related

Answer: flutter run --release

Test exactly what users will get.

From Preparing a release

With Play App Signing, which key do you keep?Related

Answer: The upload key

Google holds the app signing key.

From Publishing on Google Play

What is the benefit of an App Bundle for users?Related

Answer: Smaller downloads tailored to their device

Play delivers only what each device needs.

From Release builds, signing and the App Bundle

What do you need to build an iOS app?Related

Answer: A Mac with Xcode

Apple requires Xcode on macOS.

From Installing Flutter

Pass the quiz (60% or more) or mark this topic as done when you are ready.

Your progress is saved on this device only.

Next steps

  1. 1 more topic in “Publishing to the stores and the web” before its exam: Flutter on the web and desktop.
  2. Module 11 exam: Publishing to the stores and the web · 12 questions · 25 min, without help. 4 topics of this module still to finish first.
  3. Then the next module, Flutter careers and interviews. 50 topics left in the course before the final exam.

← Previous: Publishing on Google Play