📲 “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

  1. Go to Google Play Console

  2. Pay the one-time fee of $25 (yes, just once — Google’s surprisingly chill)

  3. 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 file

  • Add 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

  1. Go to developer.apple.com

  2. Pay $99/year – recurring. Ouch.

  3. Enable 2-Factor Authentication (they love it).

  4. 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

  1. Open ios/Runner.xcworkspace in Xcode.

  2. Set:

    • Version & Build number

    • Team and Bundle ID

    • Capabilities (e.g., push, location)

  3. From the menu:
    Product > Archive
    (Go grab a coffee. Slow builds build character.)

  4. Xcode Organizer will open. Click Distribute App > App Store Connect


🌐 Step 4: App Store Connect Setup

  1. Go to App Store Connect

  2. Create a new app:

    • Name, language, bundle ID

    • SKU (any unique string you want)

  3. 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

  1. Select your build uploaded via Xcode

  2. Add app privacy details (very strict)

  3. 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:

ToolPurpose
fastlaneAutomate iOS + Android deploy steps
CodemagicCI/CD for Flutter (build + publish)
GitHub ActionsBuild and deploy with versioning
BitriseVisual pipeline for mobile CI/CD
pubspec_versionAuto bump version in pubspec.yaml
flutter_launcher_iconsIcon generation
flutter_native_splashSplash 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.

0
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

Anmol Singh Tuteja
Anmol Singh Tuteja