Les notes officielles de Flutter 3.47.0 mentionnent la prise en charge du chemin DeviceHub.app associé à Xcode 27. Si votre outil Flutter continue à chercher l’ancien Simulator.app, commencez par vérifier ou fixer la version du SDK ; contrôlez ensuite le Xcode actif et les runtimes avant toute suppression ou réinstallation.
Mise à jour : 30 septembre 2026. Vérifications documentaires effectuées à partir des notes de version de Flutter, de sa documentation iOS et des publications Apple sur Xcode 27.
Cet article est destiné aux développeurs Flutter dont flutter devices ne trouve plus de simulateur après une mise à niveau de Xcode.
Il s’adresse aussi aux ingénieurs CI et aux responsables de plateforme qui doivent diagnostiquer un Mac distant sans perturber un nœud partagé.
Flutter 3.47 et Xcode 27 : distinguez le chemin de découverte du démarrage
La compilation, la découverte d’un appareil et le démarrage graphique du simulateur sont trois opérations différentes. Un projet peut donc compiler avec xcodebuild alors que Flutter ne répertorie aucun simulateur ; inversement, un appareil peut apparaître dans la liste sans parvenir à démarrer.
Apple présente Device Hub comme le point de gestion des appareils et simulateurs dans Xcode 27, tandis que les versions précédentes utilisaient l’application Simulator. Flutter documente également cette différence dans son guide de configuration iOS. Les notes officielles de Flutter 3.47.0 signalent l’adaptation du chemin vers DeviceHub.app.
Cette évolution cible un problème précis de découverte. Elle ne signifie pas que Flutter corrige automatiquement un runtime absent, une sélection erronée de Xcode, un problème de lancement ou chaque incident survenu après une mise à niveau. Pour éviter une réparation à l’aveugle, observez d’abord à quelle étape le comportement change.
La documentation Apple sur les nouveautés de Xcode et les notes de publication de Xcode 27 permettent de confirmer le contexte de Device Hub. Les noms et chemins d’application seuls ne suffisent pas à conclure que le runtime installé est utilisable.
Première étape : établir un état de référence
Dans le terminal où l’échec se produit, rassemblez les éléments suivants sans modifier l’installation :
flutter --version
which flutter
flutter doctor -v
xcode-select -p
xcodebuild -version
flutter devices -v
Enregistrez les sorties complètes, ainsi que le répertoire du projet et la commande exacte qui échoue. La sortie détaillée de flutter devices est particulièrement utile : elle peut indiquer si Flutter a trouvé des destinations, s’il a rencontré un problème avec les outils Apple ou s’il n’a simplement aucun appareil à proposer.
La commande xcode-select -p donne le chemin du répertoire développeur sélectionné ; xcodebuild -version permet de vérifier la version de Xcode réellement appelée. Apple décrit les outils de sélection et d’invocation de Xcode dans sa référence des outils de ligne de commande. Comparez ces résultats avec ce que votre IDE affiche et avec les variables d’environnement du processus CI.
Ne remplacez pas le chemin actif et ne supprimez pas de données avant d’avoir conservé ces sorties. Sur un nœud partagé, une modification globale peut changer le comportement d’autres projets qui utilisent un autre SDK ou une autre installation de Xcode.
Ancien chemin Simulator.app ou SDK Flutter différent ?
Le premier scénario est un décalage entre le Flutter exécuté et le chemin attendu par Xcode 27. Le second est une confusion entre plusieurs installations de Flutter. Ils peuvent produire un symptôme voisin, mais ne se corrigent pas de la même façon.
Vérifiez d’abord si l’exécutable retourné par which flutter correspond au SDK prévu pour le projet. Un gestionnaire de versions, le PATH du shell, un lancement depuis l’IDE et le compte système utilisé par un Runner peuvent chacun sélectionner un exécutable différent. Dans cette situation, mettre à jour un SDK ne change rien si les commandes continuent d’en appeler un autre.
La fiche du problème Flutter associé complète les notes de version lorsqu’il faut comprendre le contexte de la correction. Fiez-vous cependant aux versions et aux chemins visibles sur votre machine : le fait qu’un problème ressemblant ait été signalé n’établit pas que votre panne a la même cause.
Deuxième étape : comparer les points d’entrée
Exécutez les vérifications dans le terminal utilisé pour travailler, depuis l’IDE et, si l’incident concerne la CI, dans le contexte réel du Runner. Comparez les résultats plutôt que de vous limiter à la version affichée dans l’interface :
- Le chemin donné par
which flutterest-il celui du SDK attendu par le projet ? - La version de Flutter relevée par la commande correspond-elle à celle utilisée dans la configuration CI ?
- Le répertoire développeur retourné par
xcode-select -pdésigne-t-il l’installation de Xcode attendue ? - Les sorties obtenues depuis le shell, l’IDE et le Runner sont-elles cohérentes ?
- La commande de test est-elle exécutée depuis le bon dépôt et avec les mêmes réglages que le processus qui échoue ?
Si l’écart se situe dans le PATH ou dans le choix du SDK, corrigez d’abord cet écart ou fixez la version du projet à une version de Flutter qui contient la prise en charge annoncée. Relancez ensuite une commande de découverte. Évitez de mettre à jour toutes les installations à la fois : vous perdriez la possibilité de déterminer quelle modification a changé le résultat.
Appareil découvert, mais simulateur impossible à lancer ?
Si flutter devices affiche un appareil, la découverte a réussi au moins jusqu’à l’énumération. La panne peut alors se situer dans le runtime, dans le lancement du processus du simulateur ou dans l’intégration entre Flutter et les outils Apple. Ne revenez pas immédiatement au diagnostic de chemin DeviceHub.app sans examiner le nouveau symptôme.
Troisième étape : vérifier ce que les outils Apple voient
Demandez au système de lister les runtimes et appareils disponibles :
xcrun simctl list runtimes
xcrun simctl list devices available
Interprétez les résultats séparément. Un runtime absent ou non disponible oriente vers l’installation des composants ; un runtime présent avec un appareil utilisable oriente plutôt vers le lancement ou l’appel depuis Flutter. Apple décrit l’ajout des composants de simulateur dans sa documentation sur le téléchargement et l’installation de composants Xcode supplémentaires.
Reproduisez ensuite l’opération avec les outils Apple ou depuis l’interface de gestion disponible dans votre version de Xcode. Si l’appareil ne démarre pas de cette manière, le chemin Flutter n’est pas la seule explication : il faut d’abord établir que le runtime et le simulateur fonctionnent dans l’environnement Xcode concerné. Si l’outil Apple le lance mais que Flutter échoue, revenez aux sorties détaillées de Flutter, au SDK sélectionné et à la commande réellement exécutée.
Pour caractériser le défaut, consignez le message exact et l’étape où il survient : appareil absent de la liste, runtime indisponible, échec de démarrage, ou application lancée puis arrêtée. Ces résultats ne sont pas interchangeables. Une erreur de compilation sur une cible iOS ne prouve pas non plus que le simulateur lui-même est en panne.
Arbre de décision : choisissez la correction selon la preuve
- Si
which flutterdésigne un SDK inattendu, corrigez lePATHou la configuration de l’IDE avant de changer le runtime. - Si Flutter est antérieur à la version qui prend en charge le chemin
DeviceHub.app, testez une version comportant cette adaptation, ou fixez temporairement l’environnement à une version compatible connue. - Si Apple ne liste pas le runtime attendu, vérifiez les composants installés avec les outils Xcode avant d’intervenir sur les données des appareils.
- Si Apple liste et lance le simulateur, mais que Flutter ne le découvre pas, comparez le SDK actif, le Xcode actif et la sortie détaillée de Flutter.
- Si l’appareil est découvert par Flutter mais que le démarrage échoue également depuis Xcode, examinez le runtime et le processus de lancement avant d’accuser le chemin de découverte.
Vérifications pour un Mac distant et un Runner CI
Sur un Mac distant, le résultat obtenu dans votre session personnelle ne prouve pas que le Runner utilise les mêmes outils. Il peut fonctionner sous un autre compte, hériter d’un PATH différent ou démarrer avec une sélection de Xcode propre à son service. Cette distinction est déterminante lorsque la compilation passe mais qu’une étape de test sur simulateur échoue.
Pour planifier un essai sans déplacer immédiatement toute votre chaîne de livraison, vous pouvez consulter la présentation des environnements Mac distants de VMSPIN. Cela ne remplace pas la vérification du contexte du Runner : le compte, les chemins des outils et les journaux doivent correspondre à votre configuration de projet.
Quatrième étape : répéter le contrôle dans le bon contexte
Consignez les versions et chemins depuis le processus qui exécute effectivement les tâches CI. Si le Runner est lancé comme service, vérifiez son environnement au lieu de supposer qu’il hérite de votre shell interactif. Comparez ensuite cette collecte à celle du terminal ou de l’IDE, en gardant le même dépôt et les mêmes paramètres de projet.
Avant de modifier un nœud partagé, sauvegardez au minimum :
- la version et le chemin de Flutter ;
- la sélection de Xcode et sa version ;
- les sorties détaillées de
flutter doctor -vet deflutter devices -v; - le résultat des commandes
simctl; - la commande CI échouée et le journal correspondant.
Cette trace permet de revenir en arrière si un changement de PATH, de sélection Xcode ou de SDK a un effet sur d’autres tâches. Sur un Runner utilisé par plusieurs dépôts, corrigez la configuration au niveau du projet ou du travail concerné lorsque c’est possible ; une modification globale de l’outil actif peut rendre une autre chaîne de compilation incohérente.
Cinquième étape : valider avec le projet réel
Après une correction, ne vous arrêtez pas à un flutter devices désormais satisfaisant. Utilisez la cible de simulateur réellement prévue par le projet, lancez l’application, puis exécutez la tâche de test ou de construction qui échouait. Notez séparément le résultat de Flutter et celui des outils Apple : vous saurez ainsi si la découverte, le lancement et l’exécution du projet sont tous rétablis.
Une validation utile est reproductible : même compte d’exécution, même dépôt, même sélection Xcode et mêmes commandes que dans la tâche CI. Si le problème demeure, revenez au dernier état collecté et ne modifiez qu’une variable à la fois. Vous pourrez alors distinguer un SDK Flutter qui n’a pas été actualisé, un Xcode différent de celui attendu et un runtime qui manque ou ne démarre pas.
Liste de contrôle avant de toucher au nœud
- [ ] Enregistrer les versions de Flutter et de Xcode ainsi que les chemins réellement utilisés.
- [ ] Comparer le SDK Flutter du terminal, de l’IDE et du Runner CI.
- [ ] Confirmer que le Xcode sélectionné est celui attendu par le projet et la tâche de CI.
- [ ] Vérifier séparément la découverte Flutter et la liste des runtimes et appareils côté Apple.
- [ ] Tester le démarrage depuis l’outil Apple avant d’attribuer l’échec au chemin Flutter.
- [ ] Sauvegarder les journaux et ne changer qu’un élément à la fois.
- [ ] Rejouer la commande de test du projet après la correction, dans le compte d’exécution réel.
- [ ] Ne supprimer des données ni réinstaller Xcode qu’après avoir identifié une preuve correspondante et défini une méthode de retour arrière.
Questions fréquentes sur Device Hub et les simulateurs Flutter
Comment Flutter 3.47 repère-t-il les simulateurs avec Xcode 27 ?
Les notes de version de Flutter 3.47.0 indiquent une prise en charge du chemin DeviceHub.app utilisé avec Xcode 27. Vérifiez donc que la commande exécutée provient bien d’un SDK Flutter qui contient cette évolution, puis confirmez que le Xcode attendu est sélectionné. Cette adaptation ne garantit pas, à elle seule, que chaque runtime soit installé ou que chaque simulateur puisse démarrer.
Que contrôler en premier après une mise à niveau vers Xcode 27 ?
Commencez par comparer le chemin du Xcode actif, la version de Flutter et l’exécutable réellement lancé dans le terminal, l’IDE et le processus CI. Ensuite, demandez à Flutter et aux outils Apple de lister les appareils et runtimes. Ces contrôles non destructifs permettent de séparer un ancien SDK ou un mauvais Xcode d’un composant de simulateur manquant.
Device Hub s’ouvre, mais aucun appareil n’apparaît dans Flutter : que faire ?
L’ouverture de Device Hub ne prouve pas que Flutter a trouvé un appareil utilisable. Vérifiez d’abord la sortie détaillée de flutter devices, puis listez les appareils et runtimes avec les outils Apple. Si Apple ne voit aucun appareil disponible, examinez le runtime et l’installation de ses composants ; si Apple en voit un mais pas Flutter, concentrez-vous sur le SDK Flutter et son environnement.
Comment isoler une panne de simulateur sur un Mac distant de CI ?
Reproduisez les vérifications dans le compte et le contexte qui exécutent réellement le Runner, plutôt que dans votre session interactive seulement. Comparez les versions et chemins de Flutter et de Xcode, puis testez séparément la découverte et le démarrage d’un appareil. Conservez les sorties avant de modifier le nœud : un runtime indisponible et un chemin d’outil incohérent n’appellent pas la même correction.
Avant toute réinstallation, exigez un indice vérifiable
La correction du chemin de Device Hub dans Flutter 3.47 aide lorsque l’outil cherche encore l’ancien emplacement ; elle ne remplace pas la vérification du Xcode actif ni celle du runtime. Avant de supprimer des données de simulateur ou de réinstaller Xcode, exigez un élément qui relie l’action envisagée au symptôme : sortie de commande, composant absent ou échec également reproductible depuis les outils Apple. Gardez les journaux et privilégiez une modification réversible.
Si l’incident vient plutôt d’un environnement local difficile à maintenir ou d’un nœud CI dont les outils dérivent, comparez cette gestion avec un Mac distant dédié au projet. Un environnement local ne garantit pas à lui seul la disponibilité continue du Runner ; un nœud partagé peut introduire des différences de compte et de configuration ; et le suivi des SDK, runtimes et journaux reste à votre charge. À l’inverse, un Mac loué ne convient pas forcément à une charge permanente et très stable, ni aux tests qui exigent un accès physique à des périphériques.
Si vous avez besoin d’un environnement macOS temporaire pour reproduire le défaut et valider votre projet Flutter, consultez les offres Mac de VMSPIN. Rejouez d’abord vos commandes de construction et de test sur le projet réel ; adoptez ensuite le nœud distant uniquement si son contexte d’exécution répond à vos contraintes de CI.