Guide

Compiler et publier une app iOS Flutter sans Mac

Flutter marche bien sous Windows et Linux, jusqu’au moment où il faut iOS. Sur un PC, Flutter ne propose même pas la commande de build iOS. Il vous faut macOS pour cette étape, sur un Mac loué ou un runner CI. Nous avons suivi tout le parcours le 19 octobre 2026, avec Flutter 3.47.7 et Xcode 26.6.

Ce qui marche sous Windows et Linux

Votre code Dart, vos tests de widgets et vos builds Android marchent tous sur un PC. Dans notre test, une nouvelle app a passé flutter test sur les runners Windows Server 2025 et Ubuntu 24.04 de GitHub. Le job Ubuntu a aussi compilé un APK Android de debug. Le hot reload sur un émulateur Android marche de la même façon.

Ensuite, nous avons demandé un build iOS aux deux machines. Flutter cache les commandes iOS sur tout système autre que macOS. Les deux runners ont affiché la même ligne :

Could not find a subcommand named "ios" for "flutter build".

Sa liste de cibles de build proposait apk, appbundle, web et la cible desktop du système hôte. Il n’y avait ni ios ni ipa.

Ce qui demande macOS

  • flutter build ios et flutter build ipa. Le guide de publication de Flutter dit que Xcode est requis et qu’il faut un appareil sous macOS.
  • Les paquets natifs. Depuis Flutter 3.44, les plugins arrivent par Swift Package Manager. Flutter se rabat sur CocoaPods pour les plugins qui ne le prennent pas encore en charge. Les deux tournent pendant le build Xcode.
  • Le simulateur iOS. Il est fourni avec Xcode, donc il ne tourne que sur un Mac. Voyez le simulateur iOS sous Windows pour les options.
  • La signature et l’envoi. Les certificats et les profils sont créés et utilisés sur le Mac.

Installer Flutter sur un Mac loué

Un Mac MacRun est livré avec Xcode 27.1 et le simulateur iOS 27.1. Xcode 26.6 est installé aussi. Flutter n’est pas préinstallé, donc vous l’ajoutez. Vous avez les droits administrateur et Homebrew. Cette seule commande a marché dans notre test et a installé Flutter 3.47.7 en moins d’une minute :

brew install --cask flutter
flutter --version

La documentation de Flutter utilise plutôt un téléchargement. Vous décompressez le paquet macOS dans un dossier comme ~/develop, puis vous ajoutez cette ligne à ~/.zprofile :

export PATH="$HOME/develop/flutter/bin:$PATH"

Vient ensuite la configuration de Xcode décrite sur la page iOS de Flutter. Elle sélectionne Xcode, lance les tâches du premier démarrage et affiche la licence. Puis elle vérifie la plateforme iOS et les runtimes du simulateur :

sudo sh -c 'xcode-select -s /Applications/Xcode-27.1.app/Contents/Developer && xcodebuild -runFirstLaunch'
sudo xcodebuild -license
xcodebuild -downloadPlatform iOS
flutter doctor -v

Sur un Mac MacRun, Xcode 27.1 se trouve dans /Applications/Xcode-27.1.app et il est déjà sélectionné. Xcode 26.6 se trouve dans /Applications/Xcode.app. Sur un autre Mac, utilisez le chemin affiché par ls -d /Applications/Xcode*.app. Sur notre runner, flutter doctor a mis une coche verte à Xcode et a trouvé CocoaPods 1.17.0. Il a signalé les licences Android, qui ne comptent pas pour iOS.

Compiler et lancer dans le simulateur

Clonez votre dépôt, lancez flutter pub get, et compilez pour le simulateur. Dans notre test, l’app avait un plugin, shared_preferences. Aucun dossier Pods n’est apparu, donc Flutter a utilisé Swift Package Manager.

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

Prenez un nom d’appareil dans la liste et votre propre bundle ID. Sur MacRun, le runtime iOS 27.1 apporte l’appareil iPhone Duo. En partage d’écran, vous pouvez aussi utiliser flutter run avec un simulateur démarré pour le hot reload. Depuis Windows, suivez Xcode depuis Windows pour voir l’écran du Mac.

Le workflow lancé sur GitHub Actions

Voici le job macOS de notre test. Il crée une app, ajoute un plugin et compile pour le simulateur. Ensuite, il installe et ouvre l’app, puis compile et archive une release sans signature.

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: demo

Le job complet a pris 5 minutes 39 secondes. Ces lignes viennent de son journal :

[✓] 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.

Le build pour le simulateur a pris 48 secondes. Le build de release a pris 1 minute 14 secondes, et l’archive 45 secondes. La dernière ligne compte. Sans signature, Flutter s’arrête à l’archive. Un vrai .ipa demande votre équipe Apple.

Publier sur TestFlight

Il vous faut l’Apple Developer Program, qui coûte 99 USD par an. Créez l’app dans App Store Connect depuis n’importe quel navigateur. Sur le Mac, ouvrez une fois ios/Runner.xcworkspace dans Xcode. Choisissez votre équipe dans Signing and Capabilities. Puis compilez le .ipa :

flutter build ipa --build-name 1.0.0 --build-number 2

Flutter écrit l’archive dans build/ios/archive et le .ipa dans build/ios/ipa. Envoyez-le avec Transporter, ou avec cette ligne de la documentation de Flutter et une clé API App Store Connect :

xcrun altool --upload-app --type ios -f build/ios/ipa/*.ipa \
  --apiKey your_api_key --apiIssuer your_issuer_id

Nous n’avons pas pu lancer les étapes signées en CI, car notre test n’avait pas de compte Apple. Elles viennent du guide de publication de Flutter. Pour tester sur votre propre iPhone, installez le build depuis TestFlight. Un Mac distant ne voit pas un téléphone branché sur votre PC. Notre guide de publication couvre les clés API et la review.

Qui ne devrait pas louer un Mac pour ça

Si vous n’avez besoin que d’un .ipa, un build dans le cloud peut suffire. Le guide de publication de Flutter a une section sur Codemagic. Les comptes personnels Codemagic incluent 500 minutes de build macOS gratuites par mois. Un runner macOS GitHub Actions lance le workflow ci-dessus, facturé à la minute. Si vous publiez chaque semaine pendant des années, un Mac mini d’occasion peut revenir moins cher avec le temps.

Un Mac loué convient quand vous devez voir l’app. Cela veut dire le simulateur, les écrans de signature de Xcode, ou un crash dans le débogueur. Un pass journée MacRun coûte $15 pour un Mac mini M6 dédié, et une semaine coûte $59. Vous payez une seule fois et rien ne se renouvelle. Le Mac est effacé à la fin, donc poussez votre code et gardez votre .ipa avant.

Questions fréquentes

Flutter peut-il compiler pour iOS sous Windows ?

+

Non. Sous Windows et Linux, Flutter ne propose pas du tout flutter build ios ni flutter build ipa. Le guide de publication de Flutter dit qu’il faut un appareil sous macOS. Un Mac loué ou un runner CI macOS couvre cette étape.

Puis-je lancer mon app Flutter dans le simulateur iOS depuis Windows ?

+

Pas sous Windows lui-même, car le simulateur est fourni avec Xcode. Vous pouvez compiler sur un Mac distant et voir son simulateur en partage d’écran. Nous avons installé et lancé une app Flutter avec xcrun simctl sur un runner macOS.

Flutter a-t-il encore besoin de CocoaPods pour iOS ?

+

Moins souvent. Depuis Flutter 3.44, Swift Package Manager est activé par défaut pour iOS. Flutter se rabat sur CocoaPods pour les plugins qui ne le prennent pas encore en charge. Flutter dit que le registre CocoaPods passe en lecture seule le 2 décembre 2026.

Puis-je compiler un .ipa Flutter sans signature ?

+

Vous pouvez archiver sans signature. Dans notre test, flutter build ipa --no-codesign a produit un .xcarchive de 170.4 MB, puis a indiqué qu’il sautait l’IPA. Un vrai .ipa pour TestFlight demande votre équipe Apple Developer.

Combien de temps prend un build iOS Flutter sur un Mac ?

+

Sur le runner macos-26 de GitHub, un build pour le simulateur d’une nouvelle app avec un plugin a pris 48 secondes. Un build de release non signé a pris 1 minute 14 secondes. Les apps plus grosses prennent plus de temps.

Flutter est-il installé sur un Mac MacRun ?

+

Non. Xcode 27.1, Xcode 26.6 et le simulateur iOS 27.1 sont installés. Vous avez les droits administrateur et Homebrew, et brew install --cask flutter a pris moins d’une minute dans notre test.

Guides associés