Installing & Releasing Flutter App on App Store
A complete, up-to-date guide for building, signing, and publishing your Flutter app to the Apple App Store — updated for 2025–26 requirements including Xcode 16+, Privacy Manifest, and TestFlight-first workflow.
2025–26 Breaking Changes — Read Before You Start
Xcode 16+ is now mandatory
for all App Store submissions — apps built with Xcode 15 or earlier are rejected.
Privacy Manifest (PrivacyInfo.xcprivacy)
is required since November 2024 and must be included in your app. Additionally, Apple now requires
macOS 14+
to run Xcode 16. iOS deployment is impossible without a Mac.
Prerequisites
Everything required before starting iOS deployment
Account Requirements
- Active Apple Developer Program ($99/year)
- Individual or Organization enrollment
- Apple ID with 2-factor authentication
- Unique Bundle ID (reverse-domain format)
Asset Requirements
- App icon — 1024×1024px PNG (no alpha)
- Screenshots for all required device sizes
- Privacy Policy URL (hosted web page)
- App description, keywords, support URL
macOS is mandatory.iOS app deployment requires Xcode, which only runs on macOS. Windows or Linux users cannot build or submit iOS apps directly. You must have a Mac with macOS 14 Sonoma or later.
Verify your environment is correctly set up before proceeding:
# Check Flutter and Xcode setup
flutter doctor -v
# Configure Xcode command-line tools
sudo sh -c 'xcode-select -s /Applications/Xcode.app/Contents/Developer && xcodebuild -runFirstLaunch'
# Accept Xcode license
sudo xcodebuild -license accept
# Install / update CocoaPods
sudo gem install cocoapods
Register Bundle ID on Apple Developer Portal
Create a unique App ID — this cannot be changed after publishing
Log in to Apple Developer Account
Go to developer.apple.com → Sign in → Navigate to
Certificates, Identifiers & Profiles
.
Open App IDs
In the left sidebar, click
Identifiers
. Then click the
+
button to register a new identifier.
Create an Explicit App ID
Select
App IDs
→
App
. Fill in a Description and set the Bundle ID in reverse-domain format (e.g. com.yourcompany.appname).
Use
Explicit
(not Wildcard) for most apps.
Enable Required Capabilities
Select any capabilities your app needs (e.g. Push Notifications, In-App Purchase, Sign in with Apple).
Click
Continue
→
Register
.
Bundle ID is permanent. Once your app is published on the App Store, the Bundle ID (applicationId) cannot be changed. Choose carefully using a format like com.yourcompany.appname.
Create App on App Store Connect
Set up your app record and complete the required metadata
Go to App Store Connect
Open appstoreconnect.apple.com → Sign in with your Apple Developer account → Click
My Apps
.
Create a New App
Click the
+
button →
New App
. Select
iOS
platform. Fill in: App Name, Primary Language, Bundle ID (select the one you registered), and SKU (an internal unique identifier, not visible to users).
Fill in App Information
From the sidebar, select
App Information
. Set the Category, Age Rating, and ensure the Bundle ID matches what you registered. Add your Privacy Policy URL — this is required for all apps.
Complete App Privacy (Data Safety)
Under
App Privacy
, declare all data your app collects. Apple generates privacy labels from this — they appear on your App Store listing. This section is mandatory and must match your Privacy Manifest.
Set Pricing and Availability
Under
Pricing and Availability
, set your pricing tier (Free or paid), choose the territories where your app will be available, and set release date options (manual or automatic after approval).
Configure Xcode Project Settings
Open Runner.xcworkspace and configure signing, version, and capabilities
Always openios/Runner.xcworkspace(not.xcodeproj) — the workspace includes Cocoa Pods dependencies required for Flutter plugins.
# Check Flutter and Xcode setup
open ios/Runner.xcworkspace
In Xcode, select the Runner target from the project navigator, then verify these settings on the General tab:
| Setting | Where | Value / Action |
|---|---|---|
| Display Name | General → Identity | Your app's visible name on the home screen |
| Bundle Identifier | General → Identity | Must match the Bundle ID registered on App Store Connect |
| Version | General → Identity | User-facing version (e.g. 1.0.0) |
| Build | General → Identity | Unique build number — must increment for each upload |
| Automatically manage signing | Signing & Capabilities | Enable (recommended for most apps) |
| Team | Signing & Capabilities | Select your Apple Developer account team |
| Minimum Deployments | General → Deployment | iOS 12.0 or higher (set based on your target audience) |
You can also set version and build number from the command line instead of Xcode:
# Format: versionName+buildNumber in pubspec.yaml
# version: 1.0.0+1
# Or override at build time:
flutter build ipa --build-name= 1.0.0 --build-number= 1
Update your app icon by selecting Assets.xcassets in the Runner folder from Xcode's project navigator. Replace the placeholder icons with your own (1024×1024px PNG, no alpha channel for App Store).
Add Privacy Manifest
PrivacyInfo.xcprivacy must be included — apps without it are rejected
Apple requires a Privacy Manifest file ( PrivacyInfo.xcprivacy ) in all app submissions since November 12, 2024. This file documents your app's data collection practices and API usage.
Create the Privacy Manifest
In Xcode, right-click the
Runner
folder →
New File from Template
→ scroll to
Resource
→ select
App Privacy
→ click
Next
. Keep the default name PrivacyInfo and click
Create
.
Configure the Manifest
The file will be created at ios/Runner/PrivacyInfo.xcprivacy. Open it and fill in the required keys based on your app's data practices.
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><!-- Does your app use tracking? --><key>NSPrivacyTracking</key><false/><!-- Domains used for tracking (if NSPrivacyTracking is true) --><key>NSPrivacyTrackingDomains</key><array/><!-- Types of data collected --><key>NSPrivacyCollectedDataTypes</key><array/><!-- APIs accessed and the reason --><key>NSPrivacyAccessedAPITypes</key><array><dict><key>NSPrivacyAccessedAPIType</key><string>NSPrivacyAccessedAPICategoryUserDefaults</string><key>NSPrivacyAccessedAPITypeReasons</key><array><string>CA92.1</string><!-- Local storage for app functionality --></array></dict></array></dict></plist>The data types and API reasons in yourPrivacyInfo.xcprivacymust match exactly what you declared in the App Privacy section of App Store Connect. Mismatches will cause rejection.
To skip encryption documentation for apps that don't use non-exempt encryption (most apps), add this key to yourios/Runner/Info.plist: <key>ITSAppUsesNonExemptEncryption</key><false/>
Build & Archive for App Store
Create a release IPA archive and upload to App Store Connect
There are two methods to build and upload: via flutter build ipa + Xcode Organizer, or using the newer flutter build ipa with direct upload. Method A (Xcode Organizer) is recommended for first-time submissions.
Method A — Build IPA via Flutter, then Archive in Xcode:
pod install must be run before flutter build ios.Skipping this step causes missing dependency errors during the build. Always run it afterflutter pub getor whenever you add/update a Flutter plugin.
Step 2 — Archive in Xcode Organizer:
Reopen Xcode Workspace
After running flutter build ios , reopen ios/Runner.xcworkspace in Xcode to refresh the release configuration.
Select Correct Scheme and Destination
In the top toolbar, select
Product → Scheme → Runner
. Then set the destination to
Any iOS Device (arm64)
— not a simulator.
Create Archive
Select
Product → Archive
. Xcode will build and archive the app. This may take several minutes. The Xcode Organizer window opens automatically when done.
Validate the Archive
In the Xcode Organizer, select your app and the archive you just created. Click
Validate App
. Fix any reported issues before proceeding.
Upload to App Store Connect
After successful validation, click
Distribute App
→
App Store Connect
→
Upload
. Follow the prompts. The build will appear in App Store Connect within a few minutes.
Once uploaded, your build will appear in App Store Connect under TestFlight within 5–15 minutes. Apple runs an initial automated check before making it available to testers.
TestFlight — Test Before PublishingBest Practice
Always test via TestFlight before submitting to production review
TestFlight is Apple's official beta testing platform. Testing through TestFlight before submitting to the App Store is strongly recommended — it simulates the exact install experience and catches issues early.
| Track | Testers | Review Required | When to Use |
|---|---|---|---|
| Internal Testing | Up to 100 (by role) | Instant | Core team validation, QA testing |
| External Testing | Up to 10,000 (by invite link) | Beta App Review (~1 day) | Wider beta feedback before production |
| App Store (Production) | All users | Full Review (1–7 days) | Public release |
Go to TestFlight in App Store Connect
In App Store Connect, select your app → Click the
TestFlight
tab.
Add Internal Testers
Under
Internal Testing
, click
+
to add testers by their App Store Connect role (Admin, Developer, etc.). They receive an email invite to install via TestFlight.
Create External Testing Group (Optional)
For broader beta testing, click
+
under
External Testing
→ create a group → add testers by email or share an invite link. This requires a Beta App Review.
Submit App for Review
Complete the App Store listing and submit for Apple's review process
Go to App Store Tab
In App Store Connect, select your app → click the
App Store
tab → Click the version you want to submit (or create a new version).
Upload Screenshots
Under the
App Store
section, upload screenshots for all required device sizes. Required sizes include iPhone 6.9" (1320×2868 or 1290×2796px) and iPad Pro 13" (2064×2752px). Screenshots must comply with Apple's content and dimension guidelines.
Fill in App Metadata
Complete the
App Information
section: App Name (max 30 characters), Subtitle (max 30 characters), Description (up to 4,000 characters), Keywords (max 100 characters — comma-separated for ASO), and Support URL.
Select the Build
Scroll to the
Build
section and click
+
to select the TestFlight build you want to submit. Make sure it's the validated, signed release build.
Set Release Options
Choose whether to release
manually
after approval (you click release) or
automatically
as soon as approved. You can also schedule a specific release date.
Submit for Review
Review all required sections — if anything is incomplete, App Store Connect shows a warning. Once everything is filled in, click
Add for Review
→
Submit to App Review
.
During the review process, Apple's App Review team may request additional information or flag issues. Respond promptly to any feedback. Typical review time is 1–3 days for established accounts, 3–7 days for first-time submissions.
Release & Monitor Your App
Go live and track performance through App Store Connect analytics
Release After Approval
Once approved, if you chose manual release, click the
Release
button in the App Store section of your app's dashboard. Your app goes live on the App Store within a few hours.
Monitor Crashes via Xcode Organizer
Open Xcode →
Window → Organizer → Crashes
. Crash reports from App Store users appear here automatically. Alternatively, integrate Firebase Crashlytics for real-time crash reporting.
Track Analytics in App Store Connect
Under
Analytics
, monitor: impressions, product page views, downloads, sales, retention, and conversion rate. Use this data to improve your App Store listing (ASO).
Respond to User Reviews
Under
Ratings and Reviews
, respond to user feedback. Prompt, helpful responses improve your rating and demonstrate active maintenance to Apple and users.
Submit Updates
For every update, increment the
Build Number
in Xcode (each upload must have a unique build number). Create a new version in App Store Connect, upload the new build, add release notes, and submit for review again.
Keep up with Apple's annual iOS SDK updates. Apps that don't update to target the latest SDK within Apple's deadlines can be removed from App Store search results or delisted entirely.
Common Issues & Fixes
| Issue | Likely Cause | Fix |
|---|---|---|
| Build rejected — Xcode version | Built with Xcode 15 or older | Update to Xcode 16+, rebuild and resubmit |
| Missing Privacy Manifest | PrivacyInfo.xcprivacy not included | Add the file in Xcode Runner folder (Step 5) |
| Code signing error | Team not selected or certificate expired | In Xcode → Signing & Capabilities → select correct Team |
| Bundle ID mismatch | Xcode ID ≠ App Store Connect ID | Ensure identical Bundle Identifier in both places |
| Build not appearing in App Store Connect | Processing delay or automated check failed | Wait 15–30 minutes; check email for Apple processing errors |
| Screenshot rejected | Wrong dimensions or content violation | Upload correct sizes — required: 6.9" iPhone and 13" iPad |
| App crashes after store install | Missing entitlements or release config issue | Test on real device with Xcode release scheme before archiving |
Conclusion
By following these steps, you can successfully build and publish your Flutter app to the Apple App Store. Remember to always useXcode 16+ , include the required Privacy Manifest , test thoroughly via TestFlight before submitting, and respond promptly to Apple's review team feedback. Keep your app updated with the latest iOS SDK targets to ensure it remains visible and available to all users on the App Store.
