Flutter Publishing to App Stores
Your app is built and tested. The last step is publishing it so real users can download it. This topic covers how to prepare, sign, and publish your Flutter app to both the Google Play Store (Android) and Apple App Store (iOS).
Pre-Launch Checklist
Before publishing, confirm: ──────────────────────────────────────────────── ✓ App name and icon are finalized ✓ Version number and build number are set ✓ All debug code and print() statements removed ✓ API keys are not hardcoded in source code ✓ App tested on a real device (not just emulator) ✓ Privacy policy page exists (required by stores) ✓ App meets store content guidelines
Setting App Name, Icon, and Version
App Name
Android: android/app/src/main/AndroidManifest.xml Change: android:label="Your App Name" iOS: ios/Runner/Info.plist Change: CFBundleDisplayName → Your App Name
Version Number in pubspec.yaml
version: 1.2.0+5
│ │ │
│ │ └── build number (increases every upload)
│ └───── patch (bug fixes)
└───────── major.minor (features)
App Icon with flutter_launcher_icons
1. Add to pubspec.yaml:
dev_dependencies:
flutter_launcher_icons: ^0.14.0
flutter_icons:
android: true
ios: true
image_path: "assets/icon/app_icon.png"
min_sdk_android: 21
2. Run:
flutter pub run flutter_launcher_icons
Publishing to Google Play Store — Android
Step 1 — Create a Keystore (Sign Your App)
Android requires every app to be digitally signed. The keystore is your digital signature file. Create it once and keep it safe forever.
keytool -genkey -v -keystore my-key.jks \ -keyalg RSA -keysize 2048 -validity 10000 \ -alias my-key-alias
Store this .jks file securely — losing it means you can never update your app on the Play Store.
Step 2 — Configure Signing in Android
Create android/key.properties: ───────────────────────────────── storePassword=your_store_password keyPassword=your_key_password keyAlias=my-key-alias storeFile=../my-key.jks Add key.properties to .gitignore — do NOT commit to git!
In android/app/build.gradle, add signing config:
─────────────────────────────────────────────────
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(rootProject.file('key.properties')))
android {
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
Step 3 — Build the Release APK or AAB
# Build App Bundle (preferred by Play Store) flutter build appbundle # Build APK (for direct distribution) flutter build apk --release # Output location: # build/app/outputs/bundle/release/app-release.aab
Step 4 — Upload to Play Console
- Go to play.google.com/console and pay the one-time $25 registration fee
- Create a new app and fill in the store listing (title, description, screenshots)
- Go to Production → Releases → Create Release
- Upload the
.aabfile - Complete the content rating questionnaire
- Submit for review (typically 1–3 days)
Play Store Listing Diagram
┌────────────────────────────────────────────────┐ │ App Icon My Awesome App ★ 4.8 │ │ Category: Productivity │ │ [────────────────────────────────────────] │ │ [ Screenshot 1 ] [ Screenshot 2 ] │ │ [────────────────────────────────────────] │ │ Description: (up to 4000 characters) │ │ [Install] │ └────────────────────────────────────────────────┘
Publishing to Apple App Store — iOS
iOS publishing requires a Mac, Xcode, and an Apple Developer account ($99/year).
Step 1 — Configure in Xcode
- Open
ios/Runner.xcworkspacein Xcode - Set Bundle Identifier (unique: com.yourname.appname)
- Select your Team (Apple Developer account)
- Set Deployment Target (iOS 13.0 or higher recommended)
Step 2 — Build the iOS Release
flutter build ios --release
Step 3 — Archive and Upload via Xcode
- In Xcode, select Product → Archive
- Click "Distribute App" → App Store Connect
- Follow the upload wizard
Step 4 — Submit on App Store Connect
- Go to appstoreconnect.apple.com
- Create a new app record
- Fill in app name, description, screenshots, and keywords
- Select the uploaded build and submit for review (typically 1–3 days)
Platform Comparison
| Aspect | Google Play | Apple App Store |
|---|---|---|
| Account fee | $25 one-time | $99 per year |
| Review time | 1–3 days | 1–3 days |
| Mac required | No | Yes |
| Build format | .aab or .apk | .ipa |
| Signing | Keystore (.jks) | Apple certificates (Xcode) |
Updating a Published App
To release an update:
─────────────────────────────────────────────
1. Increment build number in pubspec.yaml
version: 1.2.0+5 → version: 1.2.1+6
2. Make your code changes
3. Build the release again
4. Upload the new build to the store
5. Submit for review
App Signing — Keep Your Key Safe
- Back up the
.jkskeystore file to a secure location (cloud storage + offline copy). - Never commit it to GitHub or any public repository.
- Store the key passwords in a password manager.
- Losing the keystore permanently blocks you from updating your app on Play Store.
