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
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
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
In CI, it’s recommended to put:
APPLE_ID
APP_PASSWORD
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