Free Publishing Guide
iOS Publishing Guide (App Store)
This guide walks through the entire process of publishing your Flutter or React Native iOS app to the App Store in 10 steps, start to finish. Read every line without an account, then sign up whenever you want to save your progress.
Switch to the Android guide →This guide is open to everyone
You can read every step without an account. Sign up for free to save your progress and use the full Privacy Policy and app-ads.txt tools; the Keystore Vault and Screenshot Studio unlock on the premium plan.
Step 1
Create your Apple Developer account
You cannot upload anything to the App Store without an Apple Developer Program membership. Set up the right account type first.
Apple Developer Program membership costs 99 USD per year (shown in local currency depending on region). This fee covers App Store Connect access, TestFlight, and certificate/profile creation — there is no per-app charge.
At sign-up you choose between Individual or Organization. With an Individual account, your own name appears as the developer. With an Organization account, your company name appears, but Apple requires a D-U-N-S number to verify the entity is real. It is a free 9-digit identifier from Dun & Bradstreet — apply at dnb.com, typically ready in 1-5 business days. Plan this early if you are enrolling as a company, do not leave it to the last minute.
The account is built on an Apple ID, and two-factor authentication (2FA) is mandatory. Keep a registered phone number and a trusted device (iPhone/iPad/Mac) handy — confirmation codes will arrive there.
Step 2
Set up your app identity
Bundle ID, icon, and minimum iOS version are your app's fingerprint in the Apple ecosystem — hard to change later.
The Bundle ID (e.g. com.yourcompany.yourapp) is the reverse-DNS style identifier that uniquely marks your app across Apple systems. In a Flutter project it is set via Xcode in ios/Runner.xcodeproj. Once registered in App Store Connect it cannot be changed, so choose carefully.
In Xcode's Signing & Capabilities tab you must select the developer Team matching your Apple Developer account. The "Display Name" shown on the App Store is also set here or in Info.plist — keep it under 30 characters and consistent with your brand.
The app icon must be 1024x1024 pixels, PNG format, and must NOT contain an alpha channel (transparency). Uploading an icon with alpha will be rejected by App Store Connect. If you generate it with a tool like flutter_launcher_icons, verify this setting.
The minimum iOS version (Deployment Target) is set in Xcode or in ios/Podfile. Base it on the highest minimum required by the Flutter plugins you use — setting it too high excludes older devices, too low can break some plugins from compiling.
Step 3
Certificates and code signing
iOS signing looks intimidating, but trusting Xcode's automatic mode does most of the work for you.
We recommend keeping "Automatically manage signing" enabled in Xcode's Signing & Capabilities. It creates and renews the signing certificate (the digital identity key Apple requires) and the provisioning profile (which defines what devices/capabilities the build can run with) on your behalf.
Only consider manual signing for enterprise teams sharing a common distribution certificate across developers, or for CI/CD pipelines — for day-to-day development it adds unnecessary complexity.
Step 4
Create your app in App Store Connect
Before uploading any build you must register the app in App Store Connect — this is the hub for all your metadata.
At appstoreconnect.apple.com, go to "My Apps" > "+" to create a new record. You'll select iOS as the platform, then provide the Bundle ID (must exactly match what you defined in Xcode), a SKU (your own internal reference code, not user-facing), and a primary language.
This screen also sets the app name (the store-facing name, which must be globally unique), category, and pricing/territory settings. Teams that want to reserve their app name early can create this record before a build is even ready.
Step 5
Build and upload
There are two main ways to get a Flutter .ipa into App Store Connect: Xcode Organizer or Transporter.
This command produces a release-ready .ipa file under build/ios/ipa/.
flutter build ipa --releaseYou can send the resulting file to App Store Connect either via Xcode Organizer (Window > Organizer > Archives, the "Distribute App" flow) or the standalone Transporter app (downloaded from the Mac App Store, drag-and-drop upload). Both achieve the same result; Transporter is a bit more convenient for large files or batch uploads.
There are two numbering systems: the Version (e.g. 1.2.0) is user-facing and is the part before the "+" in pubspec.yaml's version field; the Build number (the part after "+") must be unique and increasing on every upload — you cannot reuse a build number within the same version.
Track your progress, generate your policy and app-ads.txt
Sign up for Vibeloy for free and manage your entire Android and iOS launch from one place. Hosting, the Screenshot Studio, and the Keystore Vault are waiting for you on the premium plan.
Start for FreeStep 6
Test with TestFlight
Internal and external testing on TestFlight follow very different approval processes — knowing the difference saves time.
Internal Testing targets members of your App Store Connect team (up to 100 people), does NOT require Apple review, and is available as soon as the build finishes processing. Ideal for fast iteration.
External Testing targets testers invited by email or joining via a public link (up to 10,000 per group), and every new build must pass Apple's lighter "beta review". This review usually completes within a day, but plan your schedule around it.
Step 7
Prepare screenshots
The App Store now only requires screenshots for the largest screen in each device family — getting the size exact avoids rejection.
As of 2026, Apple only requires screenshots for the largest screen in each device family and auto-scales them down for smaller/older devices. The mandatory iPhone class is "6.9-inch" at 1260x2736 pixels (iPhone 17 Pro Max and similar); if you support iPad, the mandatory "13-inch" class is 2064x2752 pixels (iPad Pro M4 and similar). Being off by even 1 pixel causes rejection.
- Format: PNG or JPEG, RGB color space, must NOT have an alpha channel.
- At least 1 and up to 10 screenshots can be uploaded per device class.
- Pixel dimensions must exactly match the required size — App Store Connect does not auto-crop or resize.
This step has a Vibeloy tool
Sign up for free to use the Screenshots tool and save your progress.
Step 8
Privacy details and permissions
App Privacy labels and, for AdMob apps, tracking permission are among the most commonly skipped steps in App Store Connect.
Completing the "App Privacy" section in App Store Connect (sometimes called the "nutrition label") is mandatory: you declare what data your app collects, whether it is used to identify you, and whether it is shared with third parties for advertising or analytics. An inaccurate or incomplete declaration can lead to later rejection or takedown.
A privacy policy URL is required for every app and must point to a real, accessible page — empty or broken links result in immediate rejection.
This step has a Vibeloy tool
Sign up for free to use the Privacy Policy tool and save your progress.
Step 9
Submit for review
Apple's review is more human-driven and stricter than Google's; knowing common rejection reasons improves your odds of passing on the first try.
When submitting, use the "Review Notes" field to give the reviewer everything needed to test the app: if login is required, provide a working demo account (username/password); explain any special setup step. Missing a demo account causes reviewers to get stuck at login and reject.
- Guideline 2.1 (Performance/Completeness): Crashes, blank screens, broken links, or incomplete features are the most common rejection reason. Test end-to-end on a clean device before submitting.
- Guideline 4.3 (Spam/Templates): Resubmitting an existing template app with minor tweaks, or publishing many near-identical apps, gets rejected. Make your app clearly distinct.
- Guideline 5.1.1 (Data Collection Permissions): Requesting location, camera, notifications, etc. without explaining purpose, or leaving Info.plist usage description strings empty/vague, gets rejected. Clearly state WHY each permission is needed, in plain user-facing language.
Step 10
Release and manage updates
Once approved, when and how the release goes live is up to you — and you'll need a rhythm for the updates that follow.
App Store Connect offers three release options: automatic release as soon as approved, manual release where you press "Release" yourself after approval, or a scheduled release at a specific date/time. The manual option is ideal if you want your marketing launch decoupled from the review timeline.
Phased Release rolls the new version out to users gradually over 7 days (e.g. starting at 1% and increasing) instead of all at once. If you spot a critical bug you can pause the rollout — this reduces risk for apps with a large user base.
The post-release cycle: monitor user feedback and crash reports, bump the version/build number on every update, and keep the App Privacy declaration current as your data collection changes. Apple reviews updates through the same process as first submissions, so re-check the same checklist (permissions, demo account, screenshots) every time to reduce rejection risk on major feature changes.
Track your progress, generate your policy and app-ads.txt
Sign up for Vibeloy for free and manage your entire Android and iOS launch from one place. Hosting, the Screenshot Studio, and the Keystore Vault are waiting for you on the premium plan.
Start for Free