Expert · Publishing to the stores and the web · topic 45 of 50 · 35 min
Publishing on the Apple App Store
Explanation
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
flutter build ipa --obfuscate --split-debug-info=build/symbols
# creates an Xcode archive and an .ipa under build/ios/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 reason | Fix |
|---|---|
| The app crashes or has obvious bugs | Test release builds on real devices; check crash logs |
| Reviewer cannot log in | Provide a demo account in the review notes |
| Placeholder content, broken links, "coming soon" features | Remove or finish them |
| Missing or vague permission explanations | Write specific Info.plist usage descriptions |
| Privacy details do not match the app | Update App Privacy answers and the privacy manifest |
| Digital goods sold without Apple's in-app purchase | Follow the payments rules in the guidelines (physical goods and services like food delivery differ) |
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
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)
Can you build an iOS release on a Windows laptop with only Flutter installed?
Your login-only app was rejected because the reviewer could not sign in. What should you add?
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
Read more (free)
Related help
Before this, learn
This topic builds on these. If something here feels new, open them first.
Related topics
- Flutter on the web and desktopPublishing to the stores and the web · same module
- Release builds, signing and the App BundleKotlin and Android App Development · Publishing on the Play Store and Firebase
- Play policies: privacy, data safety and targetsKotlin and Android App Development · Publishing on the Play Store and Firebase
- Google Play Console and testing tracksKotlin and Android App Development · Publishing on the Play Store and Firebase
- Portfolio and next stepsFlutter careers and interviews
- Handling file uploads safelyBackend Development · NoSQL, ORMs and data features
Questions people ask about this
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
With Play App Signing, which key do you keep?Related
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.
What do you need to build an iOS app?Related
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 more topic in “Publishing to the stores and the web” before its exam: Flutter on the web and desktop.
- 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.
- Then the next module, Flutter careers and interviews. 50 topics left in the course before the final exam.