Eine Flutter-App für iOS ohne Mac bauen und veröffentlichen
Flutter läuft gut unter Windows und Linux, bis Sie iOS brauchen. Auf einem PC bietet Flutter den Befehl für den iOS-Build gar nicht erst an. Für diesen Schritt brauchen Sie macOS, entweder auf einem gemieteten Mac oder auf einem CI-Runner. Wir haben den ganzen Weg am 19. Oktober 2026 durchgespielt, mit Flutter 3.47.7 und Xcode 26.6.
Was unter Windows und Linux funktioniert
Ihr Dart-Code, Widget-Tests und Android-Builds laufen alle auf einem PC. In unserem Test hat eine neue App flutter test auf GitHubs Runnern mit Windows Server 2025 und Ubuntu 24.04 bestanden. Der Ubuntu-Job hat außerdem eine Debug-APK für Android gebaut. Hot Reload auf einem Android-Emulator funktioniert genauso.
Dann haben wir beide Maschinen um einen iOS-Build gebeten. Flutter blendet die iOS-Befehle auf jedem System aus, das nicht macOS ist. Beide Runner gaben dieselbe Zeile aus:
Could not find a subcommand named "ios" for "flutter build".
Die Liste der Build-Ziele bot apk, appbundle, web und das Desktop-Ziel des Hosts an. Es gab kein ios und kein ipa.
Was macOS braucht
- flutter build ios und flutter build ipa. Laut Release-Leitfaden von Flutter ist Xcode nötig, und Sie müssen ein Gerät mit macOS verwenden.
- Native Pakete. Seit Flutter 3.44 kommen Plugins über den Swift Package Manager. Für Plugins, die ihn noch nicht unterstützen, greift Flutter auf CocoaPods zurück. Beides läuft innerhalb des Xcode-Builds.
- Der iOS-Simulator. Er gehört zu Xcode und läuft deshalb nur auf einem Mac. Die Optionen finden Sie unter iOS-Simulator unter Windows.
- Signieren und Hochladen. Zertifikate und Profile werden auf dem Mac erstellt und verwendet.
Flutter auf einem gemieteten Mac einrichten
Ein Mac von MacRun hat Xcode 27.1 und den Simulator für iOS 27.1. Xcode 26.6 ist auch installiert. Flutter ist nicht vorinstalliert, das installieren Sie selbst. Sie haben Admin-Rechte und Homebrew. Dieser eine Befehl hat in unserem Test funktioniert und Flutter 3.47.7 in weniger als einer Minute installiert:
brew install --cask flutter flutter --version
Die Doku von Flutter nutzt stattdessen einen Download. Sie entpacken das macOS-Paket in einen Ordner wie ~/develop und fügen dann diese Zeile in ~/.zprofile ein:
export PATH="$HOME/develop/flutter/bin:$PATH"
Danach folgt die Xcode-Einrichtung von der iOS-Seite von Flutter. Sie wählt Xcode aus, führt die Aufgaben beim ersten Start aus und zeigt die Lizenz an. Dann prüft sie die iOS-Plattform und die Simulator-Laufzeiten:
sudo sh -c 'xcode-select -s /Applications/Xcode-27.1.app/Contents/Developer && xcodebuild -runFirstLaunch' sudo xcodebuild -license xcodebuild -downloadPlatform iOS flutter doctor -v
Auf einem Mac von MacRun liegt Xcode 27.1 unter /Applications/Xcode-27.1.app und ist bereits ausgewählt. Xcode 26.6 liegt unter /Applications/Xcode.app. Auf einem anderen Mac nehmen Sie den Pfad, den ls -d /Applications/Xcode*.app ausgibt. Auf unserem Runner gab flutter doctor Xcode einen grünen Haken und fand CocoaPods 1.17.0. Es bemängelte die Android-Lizenzen, die für iOS keine Rolle spielen.
Im Simulator bauen und ausführen
Klonen Sie Ihr Repo, führen Sie flutter pub get aus und bauen Sie für den Simulator. In unserem Test hatte die App ein Plugin, shared_preferences. Es entstand kein Pods-Ordner, also hat Flutter den Swift Package Manager genutzt.
flutter build ios --simulator xcrun simctl list devices available xcrun simctl boot "iPhone Duo" xcrun simctl install booted build/ios/iphonesimulator/Runner.app xcrun simctl launch booted com.example.demo
Nehmen Sie einen Gerätenamen aus der Liste und Ihre eigene Bundle-ID. Bei MacRun bringt die Laufzeit für iOS 27.1 das Gerät iPhone Duo mit. Über die Bildschirmfreigabe können Sie auch flutter run mit einem gestarteten Simulator nutzen, für Hot Reload. Von Windows aus zeigt Ihnen unser Leitfaden Xcode von Windows aus den Bildschirm des Macs.
Der Workflow, den wir auf GitHub Actions ausgeführt haben
Das ist der macOS-Job aus unserem Test. Er legt eine App an, fügt ein Plugin hinzu und baut für den Simulator. Dann installiert und öffnet er die App und baut und archiviert ein Release ohne Signierung.
name: flutter-guide
on: workflow_dispatch
jobs:
macos:
runs-on: macos-26
steps:
- uses: subosito/flutter-action@v2
with:
channel: stable
cache: true
- run: xcodebuild -version && sw_vers
- run: flutter doctor -v
- run: flutter create demo
- run: flutter pub add shared_preferences
working-directory: demo
- name: Simulator build
run: time flutter build ios --simulator
working-directory: demo
- name: Install and launch in the Simulator
run: |
xcrun simctl list devices available | grep -i iphone | head -5
UDID=$(xcrun simctl list devices available -j | python3 -c "import json,sys; d=json.load(sys.stdin)['devices']; print(next(x['udid'] for k,v in d.items() if 'iOS' in k for x in v if x['name'].startswith('iPhone')))")
echo "UDID=$UDID"
xcrun simctl boot "$UDID"
xcrun simctl bootstatus "$UDID"
xcrun simctl install booted build/ios/iphonesimulator/Runner.app
xcrun simctl launch booted com.example.demo
sleep 10
xcrun simctl io booted screenshot shot.png
ls -la shot.png
working-directory: demo
- name: Release build, no signing
run: time flutter build ios --release --no-codesign
working-directory: demo
- name: Archive, no signing
run: time flutter build ipa --no-codesign
working-directory: demoDer ganze Job dauerte 5 Minuten 39 Sekunden. Diese Zeilen stammen aus seinem Log:
[✓] Xcode - develop for iOS and macOS (Xcode 26.6) [5.9s] ✓ Built build/ios/iphonesimulator/Runner.app com.example.demo: 14546 ✓ Built build/ios/iphoneos/Runner.app (14.6MB) ✓ Built build/ios/archive/Runner.xcarchive (170.4MB) Codesigning disabled with --no-codesign, skipping IPA.
Der Simulator-Build dauerte 48 Sekunden. Der Release-Build dauerte 1 Minute 14 Sekunden, das Archiv 45 Sekunden. Die letzte Zeile ist wichtig. Ohne Signierung hört Flutter beim Archiv auf. Eine echte .ipa braucht Ihr Apple-Team.
An TestFlight ausliefern
Sie brauchen das Apple Developer Program, das 99 USD im Jahr kostet. Legen Sie die App in App Store Connect in einem beliebigen Browser an. Öffnen Sie auf dem Mac einmal ios/Runner.xcworkspace in Xcode. Wählen Sie Ihr Team unter Signing and Capabilities. Dann bauen Sie die .ipa:
flutter build ipa --build-name 1.0.0 --build-number 2
Flutter schreibt das Archiv nach build/ios/archive und die .ipa nach build/ios/ipa. Laden Sie sie mit Transporter hoch, oder mit dieser Zeile aus der Doku von Flutter und einem API-Schlüssel für App Store Connect:
xcrun altool --upload-app --type ios -f build/ios/ipa/*.ipa \ --apiKey your_api_key --apiIssuer your_issuer_id
Die signierten Schritte konnten wir auf CI nicht ausführen, denn unser Test hatte kein Apple-Konto. Sie stammen aus dem Release-Leitfaden von Flutter. Um auf Ihrem eigenen iPhone zu testen, installieren Sie den Build über TestFlight. Ein Remote-Mac sieht kein Telefon, das an Ihrem PC hängt. Unser Leitfaden zum Veröffentlichen erklärt API-Schlüssel und die Prüfung.
Wer dafür keinen Mac mieten sollte
Wenn Sie nur eine .ipa brauchen, reicht vielleicht ein Cloud-Build. Der Release-Leitfaden von Flutter hat einen Abschnitt zu Codemagic. Persönliche Konten bei Codemagic enthalten 500 kostenlose macOS-Build-Minuten im Monat. Ein macOS-Runner von GitHub Actions führt den Workflow oben aus, minutengenau abgerechnet. Wenn Sie jahrelang jede Woche ausliefern, kann ein gebrauchter Mac mini auf Dauer günstiger sein.
Ein gemieteter Mac passt, wenn Sie die App sehen müssen. Also den Simulator, die Signier-Ansichten von Xcode oder einen Absturz im Debugger. Ein Tagespass von MacRun kostet $15 für einen dedizierten M6 Mac mini, eine Woche kostet $59. Sie zahlen einmal, und nichts verlängert sich. Der Mac wird am Ende gelöscht, also pushen Sie vorher Ihren Code und sichern Sie Ihre .ipa.
Häufige Fragen
Kann Flutter iOS unter Windows bauen?
+
Nein. Unter Windows und Linux bietet Flutter flutter build ios und flutter build ipa gar nicht an. Laut Release-Leitfaden von Flutter müssen Sie ein Gerät mit macOS verwenden. Ein gemieteter Mac oder ein macOS-Runner für CI übernimmt diesen Schritt.
Kann ich meine Flutter-App von Windows aus im iOS-Simulator ausführen?
+
Nicht unter Windows selbst, denn der Simulator gehört zu Xcode. Sie können auf einem Remote-Mac bauen und seinen Simulator über die Bildschirmfreigabe sehen. Wir haben eine Flutter-App mit xcrun simctl auf einem macOS-Runner installiert und gestartet.
Braucht Flutter für iOS noch CocoaPods?
+
Seltener. Seit Flutter 3.44 ist der Swift Package Manager für iOS standardmäßig aktiv. Für Plugins, die ihn noch nicht unterstützen, greift Flutter auf CocoaPods zurück. Laut Flutter wird das CocoaPods-Verzeichnis am 2. Dezember 2026 schreibgeschützt.
Kann ich eine Flutter-.ipa ohne Signierung bauen?
+
Archivieren geht ohne Signierung. In unserem Test erzeugte flutter build ipa --no-codesign ein .xcarchive mit 170,4 MB und meldete dann, dass es die IPA überspringt. Eine echte .ipa für TestFlight braucht Ihr Team im Apple Developer Program.
Wie lange dauert ein Flutter-Build für iOS auf einem Mac?
+
Auf GitHubs Runner macos-26 dauerte ein Simulator-Build einer neuen App mit einem Plugin 48 Sekunden. Ein unsignierter Release-Build dauerte 1 Minute 14 Sekunden. Größere Apps dauern länger.
Ist Flutter auf einem Mac von MacRun installiert?
+
Nein. Xcode 27.1, Xcode 26.6 und der Simulator für iOS 27.1 sind installiert. Sie haben Admin-Rechte und Homebrew, und brew install --cask flutter dauerte in unserem Test weniger als eine Minute.