Flutter iOS App Store Release process

Logo

Create logo. If you are not a designer, use canva.com. Save it with resolution 1024x1024 in PNG format. I recommend to save image somewhere in your repository.

Now we need a lot of different sized icons for multiple resolution for all flutter-supported platforms. Load PNG-file from previous step on https://appicon.co, and download archive.

Extract archive.

  • Replace Icons in /ios/Runner/Assets.xcassets/AppIcon.appiconset
  • Replace icons in /macos/Runner/Assets.xcassets/AppIcon.appiconset
  • Replace icons in /android/app/src/main/res
  • Replace icons in /web/icons

Documentation

First, what we need is License. Call to your lawer to get EULA, or look for a OpenSource license at https://choosealicense.com. I recommend MIT.

Place the license file, named LICENSE or LICENSE.md to the root of your repository. Flutter will find it on next run.

Put somewhere in your app button, showing the license page.

showLicensePage(context: context, applicationVersion: 1.0, applicationLegalese: ‘© Denis Filonov’);

To get version number automaticaly, use package_info_plus from Flutter Community.

For approving app in AppStore and Google.Play we need a site with contacts page and Privacy Policy. If you does not collect or sell you users personal data, it can be something like this:

Privacy policy- We do not collect personal or anonymous data.- No registration needed.- We do not transfer data to anybody.- We do not use analytics and telemetry.

Website

You can create site were you want, on any free or paid service.

I recommend create site as static on GitHub Pages. It is free for open source projects and very simple. If your code is not open source, you can create different repository for site.

You can enable GitHub Pages on you repository settings page. Select branch or/and folder, where your site should be, put your html or md files on it and press “Save”. Site will be published in 10 minutes or less.

AppStore (iOS)

I hope, you have an Apple Developer account, if no, register new one. I strongly recommend do not use your personal AppleID, create new one. If you, for example, change region in your personal AppleID, you can be in trouble. Apple can’t solve same my issue for 4 weeks. And then I create new AppleID only for development usage.

Read the official documentation first: https://flutter.dev/docs/deployment/ios.

Create Application ID here: https://developer.apple.com/account/resources/identifiers/list.

Go to App Store Connect (https://appstoreconnect.apple.com/apps), create new app.

Fill the form with your app Bundle ID and unicue SKU — it can be any word.

And now we must add some screenshots. It’s not so easy, Apple has strong resolution requirements. We need to add minimum iPhone 5.5”, iPhone 6.5” and iPad 12.9” screenshots.

When running emulator, go to Flutter Dev Tools and disable “Debug” banner!

  • Run iOS Emulator and select “iPhone 8 Plus” in devices. Make 3-10 screenshots and drag-n-drop them on “iPhone 5.5” Display” tab.
  • Run “iPhone 11 Pro Max”, make 3-10 screenshots and drag-n-drop them on “iPhone 6.5” Display” tab.
  • Run “iPad Pro (12.9-inch) (4th generation)” make 3-10 screenshots and drag-n-drop them on “iPad Pro (3rd Gen) 12.9” Display” and “iPad Pro (2rd Gen) 12.9” Display” tab. Yes, same pictures to two tabs.

I highly recommend store your screenshots in your code repository for later use.

Field the form “Version information”. Use created site for support and marketing URL.

Add version number and copyright.

Add age rating. My app is without violence, horror, alcohol, drugs, nudity, sex and gambling, that's why it has rating 4+.

If your app needs user authorization, you must create the test user and fill name and password in next form. If no, uncheck the box.

Select, when and how you want to release.

You can add this information in different languages.

Go to “App Information” link on sidebar. Set Name and subtitle, check BundleID and select category.

Do not forget about content rights if you use something.

Go to “Pricing and Availability” link on sidebar. Select price or make the app free.

Go to “App Privacy”. Put the link on your site on GitHub Pages (yes, you can add custom domain for it). Do it for all supported languages.

Now we are ready to build application to review. Open Xcode and follow the instructions: https://flutter.dev/docs/deployment/ios#review-xcode-project-settings.

Change “Display Name”.

Select team and enable signing.

Close Xcode. Now go to terminal and build our app.

flutter build ios

or

flutter build ios -- obfuscate

If you have commercial app and need to obfuscate app.

Open Xcode. We have 2 warnings!

Click on each of them and press “Perform changes”.

We can ignore them, or change Deployment target. If we change it in Xcode, we must change it in “ios/Flutter/AppframeworkInfo.plist” the MinimumOSVersion value.

Now select destination in menu. It must be “Any iOS Device (arm64)”.

Then, select “Product → Archive” in menu.

Click “Validate App”. Select “Automatically manage signing” in wizard. Press “Validate”.

If all is OK, you will see something like this.

Now click “Distribute App”. Select “App Store Connect”, “Upload” options in wizard pages. Some more steeps, same as on validation. And uploading as final.

Now drink some coffee, and wait the letter from Apple for 5–30 minutes.

Now we can see build on App Store Connect Site. Press new button on build section.

Select build.

Some encryption info for USA. If you use any encription and not report about it, your account can be banned forever.

Click “Save” button.

Now we can submit for review, or test in TestFlight. Lets begin from TestFlight.

Add some testers from list. If list is empty, go to “Users and roles” and send invites. Do not forget send invite to yourself.

Go to build.

Fill “Test Details”.

Install “TestFlight” application from App Store.

Click save and go to mail app on iPhone/iPad/iPod. Press a link in mail. Install App.

After testing, we can submit app for review.

Ok, only 1h 30m, and we did it.

Now relax and wait letter. Or install “App Store Connect” app and see status in it.

Pascal → Fortran → Delphi → C++ → C#, TSQL → PHP, MySQL, HTML, CSS, JS → Dart, Flutter