CI/CD & App Store Deployment

Preparing and Submitting to the Apple App Store

16 min Lesson 10 of 12

Preparing and Submitting to the Apple App Store

Publishing a Flutter app to the Apple App Store involves a precise sequence of steps: creating an App Store Connect record, supplying all required metadata and screenshots, building and uploading an IPA archive, and finally submitting the build through TestFlight and then App Review. This lesson walks through every step in detail so your submission succeeds on the first attempt.

Prerequisites

Before you begin the submission process, make sure the following are in place:

  • An active Apple Developer Program membership ($99 USD/year)
  • A valid Distribution Certificate and a Provisioning Profile (App Store distribution type) created in your Apple Developer account
  • Xcode 15 or later installed on macOS with the Command Line Tools
  • Your Flutter app configured with the correct Bundle ID in ios/Runner.xcodeproj matching the one registered in App Store Connect
  • App icons at all required resolutions (use the flutter_launcher_icons package or Xcode asset catalogue)
Note: The Bundle ID you set in Xcode (Runner → General → Bundle Identifier) must exactly match the App ID registered in your Apple Developer account. A mismatch will block the upload step.

Step 1 — Create an App Store Connect Record

Log in to App Store Connect (appstoreconnect.apple.com) and create a new app:

  • Click My Apps → (+) → New App
  • Choose iOS as the platform
  • Enter the app Name (visible to users on the App Store), Primary Language, Bundle ID, and a unique SKU
  • Click Create

After creation you will land on the app’s detail page. This is where you fill in all the metadata required before Apple will accept your submission.

Step 2 — Complete App Metadata and Screenshots

Apple requires complete metadata for every submission. Navigate to the App Store tab inside your app record and fill in:

  • Description — up to 4,000 characters explaining what the app does
  • Keywords — comma-separated, max 100 characters total; drives discoverability
  • Support URL and Marketing URL
  • Version Number and Copyright string
  • Age Rating — fill in the questionnaire; Apple calculates the rating automatically
  • Category — primary and optional secondary

Screenshots are mandatory and must cover every required device size. As of 2024 you must supply screenshots for at least:

  • 6.9-inch display (iPhone 16 Pro Max)
  • 6.5-inch display (iPhone 14 Plus / 11 Pro Max)
  • 5.5-inch display (iPhone 8 Plus) — required for older OS support
  • 12.9-inch iPad Pro (6th generation) — if your app supports iPad
Tip: Use the iOS Simulator in Xcode to capture pixel-perfect screenshots at each required size. Run your app in the matching simulator, press Cmd+S to save the screenshot, then drag it into the App Store Connect media uploader.

Step 3 — Build the Release IPA in Flutter

Flutter builds a release IPA by archiving through Xcode. There are two methods:

Method A — Flutter CLI build

# Build a release archive (creates an .xcarchive under build/ios/archive)
flutter build ipa --release

# The IPA is placed at:
# build/ios/ipa/Runner.ipa

Method B — Xcode Organizer (manual archive)

# 1. Open the Xcode workspace (not the .xcodeproj)
open ios/Runner.xcworkspace

# 2. In Xcode:
#    a. Select "Any iOS Device (arm64)" as the destination
#    b. Product > Archive
#    c. Wait for the archive to appear in Organizer (Window > Organizer)
#    d. Click "Distribute App" > "App Store Connect" > Next > Upload
Warning: Always select Any iOS Device (arm64) — not a simulator — as the build destination before archiving. Archiving against a simulator target produces an x86_64 binary that App Store Connect will reject immediately.

Step 4 — Upload the Build to App Store Connect

Once you have an IPA you can upload it using either the Xcode Organizer (recommended) or Apple’s standalone Transporter app (free on the Mac App Store).

  • Xcode Organizer: After archiving, click Distribute App → App Store Connect → Upload. Xcode signs and validates the binary automatically before sending it.
  • Transporter: Drag the .ipa file into Transporter, sign in with your Apple ID, and click Deliver. Transporter runs the same validation checks as Xcode.

Apple’s servers process the upload; you will receive an email confirmation within a few minutes. The build then appears under TestFlight in App Store Connect once processing is complete (usually 5–15 minutes).

Step 5 — TestFlight Distribution (Optional but Recommended)

Before submitting to App Review it is strongly recommended to distribute the build via TestFlight:

  • Internal testers (up to 100 members of your team) get immediate access after processing
  • External testers (up to 10,000 users) require a brief Beta App Review (usually 1 business day)
  • TestFlight catches real-device bugs and crash reports before the public release

Step 6 — Submit for App Review

When the build is ready, go back to the App Store tab of your app record:

  • Under Build, click the (+) button and select the processed build
  • Fill in any missing information flagged with an orange dot
  • Complete the App Privacy questionnaire (data collection declarations)
  • Under App Review Information, add demo credentials if your app has a login screen
  • Click Submit for Review

Apple’s review team typically responds within 24–48 hours for standard reviews. You will be notified by email when the status changes to Approved or Rejected.

Key Takeaway: A successful App Store submission requires matching Bundle IDs, complete metadata, screenshots for all required device sizes, a release-mode IPA built against a real device target, and a thorough App Privacy disclosure. Preparing each piece carefully before you click Submit for Review avoids the most common rejection reasons.