📲 “Ship Happens!” – A Flutter Dev’s No-BS Guide to Publishing on Play Store & App Store 🚀

Because writing code is easy. Publishing it? That’s where the real boss level begins.
So, you've built your first Flutter app — your widget tree is blooming, animations are smooth, your app actually works (most of the time), and now it’s time to put it out in the wild.
But then… BAM! Welcome to the world of developer consoles, keystores, certificates, screenshots, privacy policies, and platform policies that read like a novel. 😅
No worries, my fellow Flutternaut. I've been through the trenches, and this is your ultimate guide to publishing your app without pulling your hair out. Let’s take it one platform at a time:
👽 PART 1: Google Play Store – Android’s Playground
🔧 Step 1: Prepare Your App for the World
1. Give your app a proper identity
You're not shipping com.example.flutterdemo
. Give it a name, icon, and version like it’s your baby!
Update your app name:
<!-- android/app/src/main/AndroidManifest.xml --> <application android:label="MyCoolApp">
Add a custom icon:
flutter pub add flutter_launcher_icons flutter pub run flutter_launcher_icons
In
pubspec.yaml
:flutter_icons: android: true image_path: "assets/icon.png"
Set your version:
version: 1.0.0+1
2. Sign It Like a Pro (AAB)
You don’t want Google screaming “UNSIGNED APK!” like a bad horror movie.
Generate a keystore:
keytool -genkey -v -keystore ~/my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key
Add
key.properties
file:storePassword=yourpassword keyPassword=yourpassword keyAlias=my-key storeFile=../my-release-key.jks
In
android/app/build.gradle
, tell Gradle what to do with your keys:def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(file("key.properties"))) signingConfigs { release { storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] keyAlias keystoreProperties['keyAlias']) keyPassword keystoreProperties['keyPassword']) } }
3. Build the bundle (AAB > APK):
flutter build appbundle
Look for the .aab
file in:build/app/outputs/bundle/release/app-release.aab
🧙 Step 2: Open the Gates – Google Play Console
Go to Google Play Console
Pay the one-time fee of $25 (yes, just once — Google’s surprisingly chill)
Create a new app:
Title
Default language
App or Game?
Free or Paid?
🖼 Step 3: Store Listing – Make It Sexy
You’ll need:
App title (max 50 chars)
Short description (max 80)
Full description (up to 4000 — tell your story)
App icon (512x512)
Feature graphic (1024x500)
Screenshots (min 2, max 8 per device type)
Privacy policy (hosted on your website or GitHub)
Contact email & website
☢️ Step 4: Policies & Permissions
Google will ask you about:
Data Safety – Explain what data you collect and why. Be honest. They will find out.
Content rating – Questionnaire-based.
App access – Does your app need login? Provide access creds for reviewers.
Ads – Show ‘em if you got ‘em.
Target audience – No, it can’t be "everyone"; be specific.
🚀 Step 5: Upload AAB & Release
Go to Production > Create Release
Upload your
.aab
fileAdd release notes like “Bug fixes and performance improvements™”
Click Review & Publish
Google takes 1–7 days to review new apps. Updates are usually faster (2–3 hours sometimes).
😬 Android Gotchas (Don’t Get Rejected!)
Don’t use “WhatsApp”, “YouTube” or other trademarks in your app name.
If your app has login, provide a test account.
Don’t fake reviews, clicks, installs. Google ain’t dumb.
Follow the Developer Policy Center
🧙 PART 2: Apple App Store – Where the Rules are Tight and the Vibe is Serious 🍏
🔧 Step 1: Get a Developer Account
Go to developer.apple.com
Pay $99/year – recurring. Ouch.
Enable 2-Factor Authentication (they love it).
Open Xcode at least once and sign in with your Apple ID.
🛠 Step 2: Prepare iOS App in Flutter
Update
pubspec.yaml
version:version: 1.0.0+1
Update app name in
Info.plist
:<key>CFBundleDisplayName</key> <string>MyCoolApp</string>
Add permissions to
Info.plist
:<key>NSCameraUsageDescription</key> <string>We need camera for scanning magic</string>
Use this to generate splash screens and icons:
flutter pub add flutter_native_splash flutter pub run flutter_native_splash:create
📦 Step 3: Build & Archive
Open
ios/Runner.xcworkspace
in Xcode.Set:
Version & Build number
Team and Bundle ID
Capabilities (e.g., push, location)
From the menu:
Product > Archive
(Go grab a coffee. Slow builds build character.)Xcode Organizer will open. Click Distribute App > App Store Connect
🌐 Step 4: App Store Connect Setup
Go to App Store Connect
Create a new app:
Name, language, bundle ID
SKU (any unique string you want)
Fill in:
App description
Screenshots (iPhone 6.5", 5.5", iPad if supported)
App icon (1024x1024)
Keywords, support email, privacy policy
🔎 Step 5: Submit for Review
Select your build uploaded via Xcode
Add app privacy details (very strict)
Submit for review
Apple takes 1–3 days for first reviews. And yes, they might reject you for a misaligned button.
😱 Apple Gotchas
Don't ship broken builds. They will reject it.
Don’t use placeholder text or lorem ipsum anywhere.
Don’t access user data unless absolutely necessary.
Make sure your UI isn’t cut off or broken on iPhone SE.
Check Apple’s App Store Guidelines
🔁 How to Publish an Update (Both Stores)
Android:
Bump version & build number
Rebuild:
flutter build appbundle
Go to Play Console → Create a new release → Upload → Publish
iOS:
Bump version & build in Xcode
Archive and upload via Xcode
Go to App Store Connect → Add to existing version → Submit
⚙️ Automation – Once You’ve Done It Manually
Because doing this 100 times manually would age you faster than Flutter’s state management debates.
🛠 Tools You’ll Love:
Tool | Purpose |
fastlane | Automate iOS + Android deploy steps |
Codemagic | CI/CD for Flutter (build + publish) |
GitHub Actions | Build and deploy with versioning |
Bitrise | Visual pipeline for mobile CI/CD |
pubspec_version | Auto bump version in pubspec.yaml |
flutter_launcher_icons | Icon generation |
flutter_native_splash | Splash screen automation |
🧠 Final Tips (aka: Dev Wisdom from Battle Scars)
Test on real devices before shipping — simulators lie.
Don’t leave
debugShowCheckedModeBanner: true
— ever.Save your keystore and credentials somewhere safe (Google Drive is not "safe").
Double-check all store descriptions, images, and privacy texts before submitting.
🤘 TL;DR:
✅ Build & sign your app properly.
✅ Upload AAB to Play Store and archive iOS with Xcode.
✅ Fill out all forms (they love forms).
✅ Submit and hope for the best.
✅ Automate when you get tired of the repetition.
Publishing is hard. But you’re harder.
Go ahead, take your masterpiece and launch it. The world deserves your Flutter magic — just remember, when “ship happens,” you're not alone.
Subscribe to my newsletter
Read articles from Anmol Singh Tuteja directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
