DEV Community

DataStack
DataStack

Posted on

How to Automatically Upload IPA in Flutter and Separate Build from Upload

When uploading for iOS in a Flutter project, a better approach is to treat it as two steps: Flutter generates the IPA package, and an upload tool submits it to App Store Connect, rather than thinking of it as 'one-click publishing with Flutter'.

By doing this, whether you're on Windows, Linux, or using Jenkins, GitLab CI, you can easily integrate the upload process.

Generate IPA

Run on a macOS build node:

flutter clean
flutter pub get
flutter build ipa
Enter fullscreen mode Exit fullscreen mode

The generated path is typically build/ios/ipa/, verify that a .ipa file exists in the directory.

Prepare Upload Account

Uploading to the App Store requires:

  • Apple Developer account
  • App-specific password
  • A signed IPA

The app-specific password is not your Apple ID login password; it needs to be created in your Apple ID security settings.

Upload Using AppUploader CLI

After downloading AppUploader, find the command-line tool in the runtime directory.

On Linux/macOS, first run chmod +x appuploader_cli, then use the upload command:

./appuploader_cli upload \
-f build/ios/ipa/Runner.ipa \
-u user@example.com \
-p xxxx-xxxx-xxxx-xxxx \
--type ios
Enter fullscreen mode Exit fullscreen mode

During upload, the tool automatically handles metadata, including AppStoreInfo.plist, so no manual generation is needed.

Integrate with Jenkins or GitLab CI

Example script:

flutter clean
flutter pub get
flutter build ipa

./appuploader_cli upload \
-f build/ios/ipa/Runner.ipa \
-u "$APPLE_ID" \
-p "$APP_PASSWORD" \
--type ios
Enter fullscreen mode Exit fullscreen mode

In CI, it's recommended to put:

APPLE_ID
APP_PASSWORD
Enter fullscreen mode Exit fullscreen mode

into environment variables or credential management, and avoid hardcoding them in scripts.

Post-Upload Checks

Go to App Store Connect → TestFlight. If the build doesn't appear, check:

  • Whether the build number has been incremented
  • Whether the Bundle ID matches
  • Whether the IPA is signed with an App Store provisioning profile
  • Whether the app-specific password is correct

Top comments (0)