Xcode 27.1 beta : votre app dans le simulateur iPhone Duo

Xcode 27.1 beta (27A9269) est sorti le vendredi 18 septembre 2026 avec le premier SDK iOS 27.1 et un type d’appareil iPhone Duo pour le simulateur, quatre jours après Xcode 27.0. Le SDK embarque toutes les API iPhone Duo que nomme le guide de préparation d’Apple, le profil du type d’appareil définit les deux écrans à 1398 par 2034 et 2007 par 2853 pixels en 3x, soit 466 par 678 et 669 par 951 points, et le runtime du simulateur se télécharge à part, à la demande de Xcode. Les notes d’Apple listent trois choses que le simulateur ne sait pas encore faire, et une app sonde liée avec le SDK 27.1 et passée par les trois positions de Device Hub remplit fermée un écran de 466 par 678 points, ses barres le long du bord arrière, et ouverte un écran de 951 par 669, regular dans les deux classes de taille, signale la pliure comme une division, la caméra et la colonne d’état comme des occultations, et laisse UIScreen.main répondre pour l’écran externe alors que l’app tourne sur l’écran interne. (Corrigé le 2 octobre : jusque-là, ce paragraphe disait que la sonde ne voyait aucune région réservée ; cette sonde avait été liée comme une app iOS 27.0.)1245613

L’essentiel

  • Dates et builds. Le flux Releases d’Apple date Xcode 27.1 beta (27A9269) du vendredi 18 septembre. xcodebuild -version affiche Xcode 27.1 et Build version 27A9269 ; les SDK iPhoneOS et iPhoneSimulator s’identifient tous deux comme iOS 27.1, build 24A94403 ; le compilateur Swift annonce la même chaîne de version swiftlang-6.4.0.34.1 que Xcode 27.0, et l’éditeur de liens le même ld-27037.1. Le xip pèse 2 027 292 809 octets, l’app décompressée 3,6 GiB, et elle s’installe à côté de Xcode 27.0 sans le remplacer.14 (11 octobre : Xcode 27.1 RC (27A9275) a suivi le 5 octobre, et App Store Connect accepte ses builds pour l’App Store comme pour TestFlight.14) (15 octobre : Xcode 27.1 est sorti en version finale, build 27A9275, le build de la RC, et l’entrée d’App Store Connect de ce jour accepte ses builds pour l’App Store sous ce nom.15)
  • Les API Duo sont dans le SDK. Les dix noms que ma vérification du 17 septembre n’avait pas trouvés dans le SDK 27.0 sont tous présents dans le SDK 27.1, parmi eux ArrangementView et reservedRegions(kind:options:layoutDirectionBehavior:) dans SwiftUICore, toolbarVerticalBehavior(_:) dans SwiftUI, ainsi que UIArrangementViewController, preferredVerticalBarBehavior et verticalBarEdge dans UIKit. SwiftUI les marque @available(anyAppleOS 27.1, *) ; les en-têtes d’UIKit marquent le contrôleur d’arrangement et les méthodes de régions réservées API_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1)), soit deux plateformes de plus que ce que listent les pages de documentation.4
  • Le profil du simulateur fixe la taille des écrans. Le type d’appareil iPhone Duo (iPhone19,4, classe de produit V68, numéro de modèle A3447) définit deux écrans intégrés : primary à 1398 par 2034 pixels, scale 3, et primary-1 à 2007 par 2853 pixels, scale 3, avec une orientation native de 270. Divisés par trois, cela donne 466 par 678 et 669 par 951 points, la valeur interne étant précisément le nombre que mon billet Duo pour les développeurs avait déduit le 10 septembre de la taille des captures d’écran d’App Store Connect. Le profil exige le runtime 27.1 ou plus récent.5
  • Ce que le simulateur fait d’une vraie app (corrigé le 2 octobre). Device Hub expose trois positions, Closed (fermé), Book (en livre) et Open (ouvert), plus Rotate Right (pivoter à droite). Une app sonde liée avec le SDK 27.1 obtient, fermée, tout l’écran externe, 466 par 678 points, compact en largeur, avec sa barre d’outils et sa barre d’onglets dressées sur le bord arrière, toolbarVerticalEdge à trailing, et deux occultations actives, la caméra et la colonne d’état. Ouverte, elle obtient tout l’écran interne, 951 par 669 points en paysage natif, regular dans les deux classes de taille, de nouveau avec des barres verticales, et une division inactive de 40 points de large au milieu, qui devient active en position Book ; pivotée, 669 par 951 avec des barres horizontales. UIScreen.main.bounds continue d’annoncer 466 par 678 alors que l’app est sur l’écran interne. Jusqu’au 2 octobre, cette puce donnait les tailles d’écran, 466 par 678 et 951 par 669, avec des marges de zone sûre de 34 de chaque côté en position ouverte, une barre d’outils horizontale et aucune région réservée dans aucune position ; le corps du billet donnait la surface mesurée par la sonde, plus étroite de 80 points que l’écran (386 points fermé, 803 entre les marges de 34 points ouvert). Tout cela venait d’une sonde liée par erreur comme une app iOS 27.0 : c’est ce qu’obtient le SDK 27.0, et la mise à jour ci-dessous présente les deux builds.61213
  • Ce que la bêta ne sait pas encore faire. Les notes d’Apple posent trois limites, le long premier lancement, l’absence de StandBy et la plupart des extensions d’app : « Initial Simulator launch can take several minutes. » (187708500), « StandBy is unavailable in the iPhone Duo Simulator runtime. » (187708663) et « Running and debugging most app extensions is unavailable in the iPhone Duo Simulator runtime. » (187708767). Ajoutez-y deux Known Issues sur Mac Catalyst pour quiconque livre aussi son app sur le Mac, et une chose qu’Apple ne liste pas : le téléchargement du runtime a échoué chez moi au premier essai avec Download failed. et n’a réussi qu’à la reprise.23

Mise à jour du 2 octobre : la sonde de septembre avait été liée comme une app iOS 27.0

Les résultats du simulateur que ce billet a portés du 21 septembre au 2 octobre étaient correctement mesurés et mal décrits. Ils montrent ce que fait le simulateur iPhone Duo d’une app compilée avec le SDK iOS 27.0. Je les ai présentés comme ce qu’il fait d’une app compilée avec 27.1.

Ce qui s’est mal passé. La sonde était un unique fichier Swift compilé en appelant directement swiftc -sdk <iPhoneSimulator27.1.sdk>. Cette option atteint le compilateur. Elle n’atteint pas l’étape d’édition de liens, où le pilote s’est rabattu sur le SDK macOS du même Xcode et a inscrit la version de ce SDK dans le binaire : LC_BUILD_VERSION indiquait sdk 27.0. C’est d’après ce nombre qu’iOS décide des comportements qu’obtient une app. Relancée le 2 octobre, la même commande affiche la cause sous forme d’avertissement, « using sysroot for ‘macOS 27.0’ but targeting ‘arm64-apple-ios27.1.0-simulator’ » (sysroot de macOS 27.0 utilisé alors que la cible est arm64-apple-ios27.1.0-simulator) ; si elle l’affichait déjà en septembre, je n’y ai vu la cause de rien.13

Comment c’est apparu. Le 2 octobre, j’ai lancé sur le même simulateur une vraie app, compilée par Xcode 27.1 beta avec le même SDK. Sa barre d’outils et sa barre d’onglets se dressaient le long du côté de l’écran externe, là où les barres de la sonde s’étaient couchées en travers du haut. otool -l sur les deux binaires montrait sdk 27.1 pour l’app et sdk 27.0 pour une sonde recompilée à la manière de septembre. Recompilée avec SDKROOT défini, la sonde indique sdk 27.1 et se comporte comme l’app. Et une version dépouillée de la sonde, compilée par Xcode 27.0 lui-même avec le vrai SDK iOS 27.0, obtient les mêmes fenêtres que la sonde mal tamponnée, si bien que les chiffres de septembre donnent une image fidèle d’un build 27.0.13

La nouvelle mesure. Le même source, lié des deux façons, dans chaque position, sur le même Xcode 27.1 beta (27A9269) et le même runtime (24A94401) :13

Position Liée avec le SDK 27.0 Liée avec le SDK 27.1
Closed fenêtre de 386 par 678 points à côté d’un bandeau noir ; barres horizontales ; toolbarVerticalEdge nil ; aucune région fenêtre de 466 par 678, tout l’écran ; barre d’outils et barre d’onglets verticales sur le bord arrière ; toolbarVerticalEdge trailing ; deux occultations actives
Closed, pivotée fenêtre de 678 par 386 ; barres horizontales ; aucune région fenêtre de 678 par 466 ; compact dans les deux classes de taille ; barres verticales ; deux occultations actives, la caméra et la colonne d’état
Open fenêtre de 871 par 669 ; barres horizontales ; aucune région fenêtre de 951 par 669 ; barres verticales ; une division inactive, une occultation inactive et une active
Open, pivotée fenêtre de 669 par 871 ; barres horizontales ; aucune région fenêtre de 669 par 951 ; barres horizontales ; toolbarVerticalEdge nil ; les trois mêmes régions, pivotées
Book comme Open comme Open, avec la division active
Book, pivotée comme Open, pivotée comme Open, pivotée, avec la division active

Ce qui est retiré. Trois affirmations, chacune vraie pour le build 27.0 et fausse pour un build tamponné 27.1 : que la barre d’outils ne se dessinait jamais verticalement ; que reservedRegions ne renvoyait rien dans aucune position ; et que le simulateur ne donnait à l’app que l’écran à côté du bandeau d’état. Une quatrième se trompait de raison : j’avais écrit que l’arrangement scindé « stays side by side even though the container is now taller than it is wide » (reste côte à côte alors même que le conteneur est désormais plus haut que large) une fois pivoté. La vue d’arrangement de la sonde était elle-même plus large que haute dans cet écran, et elle se scinde selon sa propre forme ; un arrangement qui remplit l’écran pivoté s’empile, comme le guide d’Apple l’annonce. Une cinquième : « L’essentiel » donnait les tailles d’écran, 466 par 678 et 951 par 669, là où le corps du billet donnait la surface mesurée par la sonde, plus étroite de 80 points (386 points fermé, 803 entre les marges de 34 points ouvert) ; le build 27.0 n’a jamais eu tout l’écran.713

Ce qui tient. Tout ce qui se trouve hors de la section sur le simulateur : les dates et les builds, la table des symboles du SDK, le profil d’appareil et ses tailles en pixels et en points, le téléchargement du runtime, les Known Issues d’Apple. Dans la section elle-même : les tailles d’écran, les classes de taille, les positions qu’offre Device Hub, le plantage de screenConfig, et le piège de UIScreen.main, que la nouvelle mesure a reproduit sous le tampon 27.1. La note du 24 septembre que remplace cette mise à jour supposait que les zéros venaient d’une lecture trop précoce des régions, et promettait une nouvelle mesure à plusieurs angles de charnière. La supposition était fausse : le build 27.0 n’en obtient aucune, quel que soit le temps pendant lequel il les demande. L’observation qu’elle citait de Molzahn tient : la sonde correctement liée n’a lu aucune région lors de ses six à neuf premières évaluations, puis toutes ensuite. Les mesures à différents angles de charnière n’ont pas été faites.1213

Si vous avez construit votre propre sonde d’après ce billet, vérifiez-la : otool -l <app>/<binary> | grep -A4 LC_BUILD_VERSION. Un projet compilé par Xcode reçoit le bon tampon. Un fichier compilé à la main a besoin que SDKROOT soit exporté vers le SDK du simulateur avant que swiftc ne s’exécute. L’exemple complet qui a mis le problème au jour présente la comparaison à trois, avec en plus un tampon iOS 26.

Mise à jour du 26 octobre : le téléphone est sorti sous 27.1, et les numéros du SDK final

L’iPhone Duo est arrivé en magasin le vendredi 23 octobre sous iOS 27.1, d’après la newsroom d’Apple et sa page des mises à jour de sécurité, qui liste « iOS 27.1 » pour le seul « iPhone Duo », sans entrée CVE publiée ; aucun élément iOS 27.1 n’a jamais atteint le flux Releases, aucune page de notes de version de 27.1 n’est apparue, et l’index liste 27 et 27.2. Sur ce Mac, avec Xcode 27.1 (27A9275), la version finale depuis le 15 octobre, les SDK iPhoneOS et iPhoneSimulator s’identifient comme iOS 27.1, build 24A94232, un numéro inférieur au 24A94403 de la bêta relevé plus haut, et le runtime de simulateur iOS 27.1 est 24A94425, que xcrun simctl list runtimes -j liste avec un seul type d’appareil pris en charge, l’iPhone Duo ; simctl create d’un iPhone 16 Pro sur ce runtime échoue avec « Incompatible device. » iOS 27.2 est sorti aujourd’hui, 26 octobre (24B119, avec un second build d’iOS 27.2, 24B91020, à la même minute), et les notes de la RC de Xcode 27.2 (27B48, 19 octobre) portent quatre entrées sur l’iPhone Duo : « Fixed: In the iPhone Duo simulator, an app using CameraCaptureAccessory can use both displays at the same time without an active camera capture session. » (dans le simulateur de l’iPhone Duo, une app qui utilise CameraCaptureAccessory peut utiliser les deux écrans à la fois sans session de capture caméra active) (190155353) ; « When switching between the inner and outer display of the iPhone Duo simulator, modifier keys such as Shift and Command might stop working. » (en passant de l’écran intérieur à l’écran extérieur du simulateur de l’iPhone Duo, les touches de modification comme Maj et Commande peuvent cesser de fonctionner) (189465196), avec pour contournement « Click with the mouse on the currently visible screen. » (cliquer avec la souris sur l’écran actuellement visible) ; et deux Known Issues reconduits depuis les bêtas, désormais tous deux sous Device Hub, des captures d’écran « black for up to a few minutes after booting the device » (noires pendant quelques minutes après le démarrage de l’appareil) (187146039) et des outils d’accessibilité qui « cannot convey screen content on an iPhone Duo within Device Hub » (ne peuvent pas restituer le contenu de l’écran d’un iPhone Duo dans Device Hub) (187148389). L’entrée Mac Catalyst sur les « APIs specific to iOS 27.1 » (API propres à iOS 27.1) est inchangée. Une entrée UIKit des notes d’iOS 27.2 nomme 27.1, les marges de mise en page par défaut nulles de UIView ; une sonde compilée à partir d’une seule source et exécutée sur le runtime 27.1 dans un simulateur d’iPhone Duo indique 8 points quand son LC_BUILD_VERSION est tamponné sdk 27.0 (le piège de la compilation à la main contre lequel met en garde la mise à jour du 2 octobre ci-dessus) et zéro quand il est tamponné sdk 27.1 : le changement dépend donc du SDK auquel le binaire est lié autant que du système ; le billet sur les notes de version d’iOS 27.2 donne le tableau.16

Que contient la bêta ?

Le flux Releases d’Apple liste « Xcode 27.1 beta (27A9269) » le vendredi 18 septembre à 10 h 00 PT, et un « TestFlight Update » le même après-midi ; les notes de version d’App Store Connect pour cette journée indiquent qu’il est désormais possible d’envoyer en test interne et externe des apps compilées avec Xcode 27.1 beta et le SDK pour iOS 27.1 beta ou iPadOS 27.1 beta : « You can now submit apps built with Xcode 27.1 beta using the SDK for iOS 27.1 beta or iPadOS 27.1 beta for internal and external testing. »1 La section Overview des notes de version nomme la série de SDK : « Xcode 27.1 beta includes Swift 6.4 and SDKs for iOS 27.1, iPadOS 27, tvOS 27, watchOS 27, macOS 27, and visionOS 27. Xcode 27.1 beta supports on-device debugging in iOS 17 and later, tvOS 17 and later, watchOS 10 and later, and visionOS. Xcode 27.1 beta requires a Mac running macOS Tahoe 26.6 or later. »2 Lisez cette liste telle qu’elle est écrite : iOS est la seule plateforme en 27.1, le SDKSettings.plist du SDK annonce lui-même la version 27.1, et App Store Connect appelle ce même SDK « iPadOS 27.1 beta », une bizarrerie que traîne aussi le billet sur Xcode 27.

Le téléchargement est plus léger que le numéro de version ne le laisse croire. Le xip pèse 2 027 292 809 octets, signé par Apple sous son certificat Software Update, et se décompresse en une app de 3,6 GiB, la même taille que Xcode 27.0 ; xip --expand dans un dossier, un renommage en /Applications/Xcode-27.1-beta.app et un DEVELOPER_DIR qui pointe dessus, voilà toute l’installation pour travailler en ligne de commande. Le premier appel à xcodebuild sous la bêta a ensuite passé environ deux minutes à installer de lui-même les paquets embarqués CoreTypes.pkg et XcodeSystemResources.pkg, l’étape que xcodebuild -runFirstLaunch exécute explicitement, et c’est le second de ces paquets qui met en place le type d’appareil iPhone Duo.4 Ce que l’app ne contient pas, c’est un runtime de simulateur. La bêta trouve les runtimes iOS déjà présents sur ce Mac, dont 27.0, et aucun pour 27.1 ; sous la bêta, xcodebuild -downloadPlatform iOS nomme la pièce manquante « iOS 27.1 Simulator (24A94401) » et la récupère sous forme d’image disque cryptex via le service mobile-asset d’Apple, alors que les images disque de la page de téléchargement pour développeurs s’arrêtent au iOS 18.2 Simulator Runtime.34 Le premier essai s’est terminé par DVTDownloadable: Download Failed avec Error Domain=DVTDownloadableErrorDomain Code=41 "Download failed." ; le second, avec -buildVersion 24A94401, a annoncé le runtime à 7,85 GB, est allé au bout, et simctl list runtimes a alors listé « iOS 27.1 (27.1 - 24A94401) ». Prévoyez l’espace disque en conséquence : le runtime pèse quatre fois le téléchargement de Xcode.3

L'écran externe du simulateur iPhone Duo au premier démarrage, sous iOS 27.1 beta, avec un écran d'accueil sombre, une icône Réglages en haut à gauche, l'heure et l'état du Wi-Fi empilés verticalement sur le bord droit, une tuile du Dock à droite et un bouton Rechercher en bas à droite

L’écran externe du simulateur iPhone Duo au premier démarrage, 1398 par 2034 pixels : les indicateurs d’état descendent le long du bord droit, le côté où les Human Interface Guidelines d’Apple placent la Dynamic Island et la barre d’état sur l’iPhone Duo.10

Comment se procurer le simulateur iPhone Duo ?

Trois étapes, et aucune n’est un bouton de téléchargement sur une page web. Apple ne livre le simulateur que dans Xcode, et seulement dans la bêta 27.1 : les notes de la bêta 27.2 contiennent un encadré qui dit « Download Xcode 27.1 beta to get the iOS SDK and simulator support for iPhone Duo. » (téléchargez Xcode 27.1 beta pour obtenir le SDK iOS et la prise en charge du simulateur pour l’iPhone Duo).8 (11 octobre : Xcode 27.1 RC (27A9275) est sorti le 5 octobre, et ses notes listent les mêmes Known Issues du simulateur iPhone Duo ; la bêta n’est donc plus le seul Xcode 27.1 dont les notes couvrent le simulateur Duo. Je n’ai pas installé la RC.14) (15 octobre : Xcode 27.1 est sorti en version finale, build 27A9275, le build de la RC, avec les deux mêmes Known Issues du simulateur Duo dans ses notes ; je ne l’ai pas installé.15)

  1. Xcode 27.1 beta (27A9269), depuis les téléchargements développeur, datée du vendredi 18 septembre dans le flux Releases d’Apple. Décompressez le xip, déplacez l’app sous un nom versionné comme /Applications/Xcode-27.1-beta.app à côté de Xcode 27.0, et pointez DEVELOPER_DIR dessus pour le travail en ligne de commande ; la bêta exige macOS Tahoe 26.6 ou ultérieur.12
  2. Le runtime iOS 27.1, que le xip ne contient pas. Lancez xcodebuild -downloadPlatform iOS avec DEVELOPER_DIR réglé sur la bêta ; la commande récupère le runtime 27.1 qui rend le type d’appareil iPhone Duo démarrable, et les notes d’Apple préviennent que le premier lancement du Simulator « can take several minutes » (peut prendre plusieurs minutes) en plus du téléchargement. Ma première tentative a échoué et la seconde a fonctionné : réessayez donc avant de chercher une cause.23
  3. Device Hub, où se trouvent l’appareil et ses positions. Ajoutez ou sélectionnez l’appareil iPhone Duo, démarrez-le et utilisez les boutons de position, Closed, Book et Open, plus Rotate Right ; simctl n’a aucune commande de position. Les tailles et captures d’écran par position plus bas proviennent de ce chemin.6

Apple ne propose aucune version navigateur. Une page trouvée sous « iPhone Duo simulator online » n’exécute pas le runtime iOS 27.1 d’Apple : quoi qu’elle dessine, elle n’est donc pas la source des classes de taille, des régions réservées ni du comportement de l’écran externe mesurés ici. Pour vérifier une mise en page sans le runtime, le canevas Previews de Xcode a gagné dans cette bêta un groupe Display pour l’écran alternatif.2

Le SDK 27.1 contient-il les API Duo ?

Le 17 septembre, j’ai cherché dans le SDK iOS 27.0 les noms employés par le guide « Preparing your app for iPhone Duo » d’Apple et je n’ai trouvé aucun des dix noms propres à l’appareil. La même recherche menée de la même manière contre le SDK 27.1, une simple recherche de texte dans les interfaces de module et les en-têtes, les trouve tous. Les lignes sont les sous-chaînes recherchées : sept d’entre elles portent neuf des dix noms, les deux méthodes reservedRegions et les deux membres axisBehavior se partageant chacun une ligne, et les trois autres sont les types derrière ces noms, soit ReservedRegion, ToolbarVerticalBehavior pour toolbarVerticalBehavior(_:) et UIVerticalBarBehavior pour preferredVerticalBarBehavior :4

Sous-chaîne recherchée Interface SwiftUICore Interface SwiftUI Interface UIKit En-têtes UIKit
ArrangementView 45 0 19 4 fichiers
UIArrangementViewController 0 0 19 4 fichiers
ReservedRegion 16 0 15 3 fichiers
reservedRegions 2 0 5 1 fichier
ToolbarVerticalBehavior 0 5 0 0
UIVerticalBarBehavior 0 0 0 1 fichier
verticalBarEdge 0 0 0 1 fichier
toolbarVerticalEdge 1 0 0 0
axisBehavior 0 2 0 1 fichier
preferredVerticalBarBehavior 0 0 0 1 fichier

Deux détails de ce tableau comptent pour la façon d’écrire le code. Les types SwiftUI vivent dans SwiftUICore, le module que import SwiftUI réexporte, un import ordinaire les trouve donc ; et les attributs de disponibilité contredisent la documentation sur les plateformes. L’interface SwiftUICore déclare ArrangementView, l’interface SwiftUI déclare toolbarVerticalBehavior(_:), toutes deux sous @available(anyAppleOS 27.1, *), le raccourci d’Apple pour toutes les plateformes à cette version, tandis que UIArrangementViewController.h et les méthodes reservedRegionsOfKind: dans UIView.h portent API_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1)) avec API_UNAVAILABLE(watchos) ; dans UIVerticalBarEdge.h, l’énumération et le trait verticalBarEdge portent la même paire, alors que les cas Leading et Trailing portent API_AVAILABLE(ios(27.1)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos, tvos). Les pages de documentation d’Apple pour ces cinq entrées ne listent qu’iOS 27.1 et iPadOS 27.1, marqués bêta.47 Écrivez pour iOS et laissez le compilateur vous dire le reste.

Les trois noms employés par le guide qui étaient déjà dans le SDK 27.0 n’ont pas bougé : presentationPlacement(_:) se trouve toujours sous @available(anyAppleOS 27.0, *), backgroundExtensionEffect() est là depuis iOS 26, et des deux cas de ToolbarItemPlacement que nomme le guide, topBarPinnedTrailing se trouve sous @available(iOS 27.0, visionOS 27.0, *) tandis que cancellationAction ne porte aucune disponibilité propre au-delà de celle du type.4

Que dit le profil du simulateur sur les deux écrans ?

Le type d’appareil qu’Apple installe pour la bêta, iPhone Duo.simdevicetype, est un simple bundle placé sous /Library/Developer/CoreSimulator/Profiles/DeviceTypes, et ses deux listes de propriétés répondent à des questions que la fiche technique laissait ouvertes.5

profile.plist donne l’identité : identifiant de modèle iPhone19,4, classe de produit V68, un alias com.apple.CoreSimulator.SimDeviceType.V68, minRuntimeVersion 27.1, et une règle de création par défaut de l’appareil pour les runtimes à partir de 27.1. capabilities.plist donne le matériel : numéro de modèle A3447, HomeButtonType 2, DeviceSupportsDynamicIsland true, DeviceSupportsEnhancedMultitasking false, IsLargeFormatPhone true, un CompatibleDeviceFallback valant iPhone18,3, un rayon de coin d’appareil de 59, et un tableau displays avec deux entrées intégrées et trois virtuelles.5

Écran dans le profil Pixels Scale Points Orientation native Rayons des coins Espace colorimétrique
primary (« LCD », écran 1) 1398 par 2034 3 466 par 678 0 8, 59, 8, 59 P3
primary-1 (« LCD-1 », écran 3) 2007 par 2853 3 669 par 951 270 55 sur les quatre sRGB

La première ligne est l’écran externe et correspond pixel pour pixel à la fiche technique d’Apple. La seconde est l’écran interne, et son nombre de pixels est celui des captures d’écran d’App Store Connect, 2007 par 2853, plutôt que les 1878 par 2670 de la dalle : le simulateur rend l’écran interne à 669 par 951 points en 3x, soit exactement le calcul que mon billet Duo pour les développeurs avait posé le 10 septembre en le qualifiant de déduction. Le profil d’Apple porte désormais ce nombre. L’orientation native à 270 degrés dit que l’écran interne est nativement en paysage, 951 points de large sur 669 de haut quand le téléphone est ouvert, ce qui concorde avec les dimensions qu’Apple donne pour l’appareil ouvert. Les deux nombres restants sont des valeurs de simulateur et non de matériel : les deux écrans sont listés à 460 pixels par pouce et 60 Hz, alors que la fiche technique donne 430 ppp à la dalle interne, il faut donc traiter hdpi comme un espace réservé.5

Le profil livre aussi les formes. Chaque écran référence un masque de framebuffer, un PDF de la zone visible. Le masque de l’écran externe a des coins asymétriques, les valeurs du profil donnant 8 sur un grand côté et 59 sur l’autre, et selon ma lecture le petit rayon se trouve du côté qui rejoint la charnière centrale que décrit le guide de design d’Apple ; le masque de l’écran interne est un simple rectangle arrondi, avec la valeur de coin 55 du profil et sans découpe pour la caméra frontale, l’occultation de la caméra vient donc de l’API de régions réservées à l’exécution, et non de la forme du framebuffer.510

Que montre le simulateur ?

L’appareil démarre fermé. Au premier démarrage, l’écran externe affiche l’écran d’accueil et le framebuffer de l’écran interne est allumé mais noir, et simctl io enumerate liste les deux écrans intégrés sous les noms du profil, primary à 1398 par 2034 et primary-1 à 2007 par 2853, à côté des écrans virtuels habituels.6 C’est dans Device Hub que vivent les positions. L’appareil Duo sélectionné, sa fenêtre expose Rotate Right, Closed, Book et Open sous forme de boutons que l’API d’accessibilité peut presser, et c’est ainsi qu’a été menée toute cette section ; simctl n’a pas de commande de position.6

La sonde est une app SwiftUI tenant dans un seul fichier : une vue à onglets contenant une pile de navigation avec cinq éléments de barre d’outils, un relevé de la géométrie, des classes de taille, de la valeur d’environnement toolbarVerticalEdge, de la charnière et des régions réservées des deux sortes avec includeInactive, et une ArrangementView dans le style scindé. Elle lit les régions à chaque évaluation de son body et se réévalue une fois par seconde. Les chiffres ci-dessous viennent de la nouvelle mesure du 2 octobre, liée avec le SDK 27.1 ; les mesures de septembre, liées par erreur comme 27.0, suivent sous leur propre titre.13

Liée avec le SDK 27.1

Closed. L’app obtient tout l’écran externe : sa fenêtre mesure 466 par 678 points, compact en largeur et regular en hauteur. La barre d’outils et la barre d’onglets se dressent sur le bord arrière, sous l’heure, toolbarVerticalEdge indique trailing, et le trait verticalBarEdge d’UIKit se lit comme la valeur brute 2. Le contenu de la pile de navigation mesure 382 par 562 points, avec des marges de zone sûre de 82 en haut, 34 en bas et 84 sur le bord arrière, ces 84 points étant le bandeau. Deux occultations sont signalées, toutes deux actives : l’une de 37 points de côté, là où se trouve la caméra externe, et l’autre de 84 par 170, qui couvre la caméra et la colonne d’état au-dessus des barres. Aucune division n’est signalée sur cet écran. Couché sur le côté, il mesure 678 par 466, compact dans les deux classes de taille, avec les barres toujours sur le bord arrière.13

La sonde sur l'écran externe du simulateur iPhone Duo, liée avec le SDK 27.1 : taille du contenu 382 par 562 points, classes de taille compact et regular, toolbarVerticalEdge trailing, charnière fermée, deux occultations actives, un arrangement scindé empilé, et sur le bord droit une colonne qui réunit l'heure et l'état du Wi-Fi, quatre boutons de barre d'outils et trois boutons d'onglet

Closed, SDK 27.1 : tout l’écran de 466 par 678 points, les barres le long du bord arrière.

Open. L’app passe sur l’écran interne dans son orientation paysage native : une fenêtre de 951 par 669 points, regular dans les deux classes de taille, les barres toujours verticales sur le bord arrière. Le contenu mesure 867 par 553, avec les trois mêmes marges. Trois régions reviennent. Une division de 40 points de large court sur toute la hauteur au milieu de l’écran, de x 455 à 495, avec des marges de 20 points de chaque côté, et elle est inactive : le téléphone est à plat. Une occultation inactive de 58 par 37 marque la caméra interne, qui selon les directives d’Apple « stays hidden until the camera is active. » (reste masquée tant que la caméra n’est pas active).10 Une occultation active de 84 par 120 couvre la colonne d’état. L’arrangement scindé place ses deux volets côte à côte et partage la largeur à parts égales.13

La sonde sur l'écran interne en position Open, liée avec le SDK 27.1 : taille du contenu 867 par 553 points, classes de taille regular et regular, toolbarVerticalEdge trailing, charnière entièrement ouverte à 180 degrés, une division inactive à x 455 de quarante points de large, une occultation inactive et une active, un arrangement scindé côte à côte, et les barres en colonne sur le bord droit

Open, SDK 27.1 : 951 par 669 points, la pliure signalée comme une division inactive au milieu.

Book. La position Book de Device Hub signale la charnière comme partiellement ouverte, à 127 degrés. La fenêtre ne change pas de taille. Ce qui change, c’est la division : même cadre, désormais active. L’arrangement scindé y répond en plaçant son séparateur sur la pliure et en laissant vide la bande de 40 points, si bien que le volet primaire s’arrête à x 455 et que le secondaire commence à 495. Une feuille présentée dans cette position se décentre vers la moitié avant.13

La sonde sur l'écran interne en position Book, liée avec le SDK 27.1 : charnière partiellement ouverte à 127 degrés, une division active, et les deux volets de l'arrangement scindé séparés par une bande vide au milieu de l'écran

Book, SDK 27.1 : la division est active, et l’arrangement scindé laisse la pliure vide.

Pivotée. Rotate Right, téléphone ouvert, donne une fenêtre de 669 par 951 points, toujours regular dans les deux classes de taille, et les barres redeviennent horizontales : toolbarVerticalEdge est nil, la barre d’outils se place en haut à côté de l’heure, la barre d’onglets flotte en bas. Cela concorde avec les directives de conception d’Apple, qui conservent « standard horizontal bars » (les barres horizontales standard) sur l’écran interne en portrait.10 Les trois mêmes régions sont signalées dans l’espace de coordonnées pivoté : la division est maintenant une bande horizontale de 40 points de haut en travers du milieu, inactive à plat et active en Book. La vue d’arrangement de la sonde, plus large que haute dans cet écran, reste côte à côte.13

La sonde sur l'écran interne pivoté en portrait, liée avec le SDK 27.1 : taille du contenu 669 par 734 points, classes de taille regular et regular, toolbarVerticalEdge nil, une barre d'outils horizontale en haut à côté de l'heure, une barre d'onglets flottante en bas, une division inactive et deux occultations

Ouverte et pivotée, SDK 27.1 : barres horizontales, la pliure devenue une bande horizontale.

Deux constats tiennent dans toutes les positions. Les régions arrivent tard : à chaque lancement, les six à neuf premières évaluations du body de la sonde n’en lisaient aucune, et chacune des suivantes les lisait toutes, si bien qu’une vue qui pose la question une seule fois, lors de sa première passe de mise en page, obtient une réponse vide. La fixture DuoProbe de Sven-Eric Molzahn a documenté exactement cela le 20 septembre (« reservedRegions is empty on the first geometry evaluation and populated on a later one », c’est-à-dire vide lors de la première évaluation de la géométrie et rempli lors d’une évaluation ultérieure), ainsi que la bande de 40 points, et le guide du simulateur publié par SwiftLee le 22 septembre ajoute que « Holding Option ⌥ reveals a slider that you can use to control the hinge angle of the device with precision » (maintenir Option ⌥ enfoncée fait apparaître un curseur qui permet de régler précisément l’angle de charnière de l’appareil), un curseur dont je ne me suis pas servi.12 Et UIScreen.main.bounds répond 466 par 678 points, l’écran externe, alors que l’app est sur l’écran interne, soit exactement le piège contre lequel met en garde le guide d’Apple quand il dit de fonder les calculs de mise en page « based on your scene or containing view’s bounds rather than screen dimensions » (sur les limites de votre scène ou de la vue contenante plutôt que sur les dimensions de l’écran) : l’écran principal n’est pas l’écran sur lequel vous êtes. L’écran propre à la scène de la fenêtre, lui, signale l’écran sur lequel l’app se trouve réellement.713

Une voie vers les autres positions ne fonctionne pas. simctl io screenConfig peut éteindre un écran, et éteindre l’écran externe pendant que l’interne restait allumé n’a pas ouvert le téléphone ; cela a fait planter le shell système du simulateur, simctl launch a ensuite échoué avec « The system shell probably crashed. », et il a fallu redémarrer. Les positions vivent dans la fenêtre de Device Hub.6

Liée avec le SDK 27.0

Voici les chiffres que portait cette section jusqu’au 2 octobre, mesurés les 19 et 20 septembre avec une sonde qui avait une pile de navigation et pas de vue à onglets, puis mesurés de nouveau le 2 octobre avec la sonde actuelle. Ils décrivent ce qu’obtient sur ce simulateur une app compilée avec Xcode 27.0.613

Fermée, la fenêtre fait 386 points de large sur un écran de 466 points : le système garde pour lui le bandeau de 80 points, y dessine l’heure et l’état sur fond noir, et la barre d’outils de l’app se couche en travers du haut. Ouverte, la fenêtre mesure 871 par 669, les mêmes 80 points manquent à droite, et les marges de zone sûre sont de 34 de chaque côté. Ouverte et pivotée, les 80 points sont pris en haut à la place. Dans toutes les positions, les classes de taille sont celles du build 27.1, toolbarVerticalEdge est nil, verticalBarEdge se lit comme la valeur brute 0, et les deux requêtes de régions réservées renvoient des tableaux vides, même en incluant les régions inactives et quel que soit le temps pendant lequel la sonde continue de les demander ; Book ne se distingue pas d’Open.

La sonde de septembre sur l'écran externe du simulateur iPhone Duo, liée avec le SDK 27.0, avec une barre d'outils en haut à droite portant une icône de partage, des points de suspension et une coche, les valeurs taille 386 par 510 points, classes de taille compact et regular, toolbarVerticalEdge nil, divisions 0 et occlusions 0, un arrangement scindé avec la vue primaire au-dessus de la vue secondaire, et l'heure et l'état du Wi-Fi empilés sur un bandeau noir au bord droit

Closed, liée comme 27.0 : l’app s’arrête au bandeau et sa barre d’outils reste horizontale.

La sonde de septembre sur l'écran interne en position Open, liée avec le SDK 27.0, avec une taille de 803 par 515 points, des classes de taille regular et regular, toolbarVerticalEdge nil, divisions 0 et occlusions 0, un arrangement scindé avec la vue primaire et la vue secondaire côte à côte, la barre d'outils en haut à droite, et l'heure et l'état du Wi-Fi dans un bandeau noir sur le bord droit

Open, liée comme 27.0 : regular dans les deux dimensions, le bandeau gardé par le système.

La sonde de septembre sur l'écran interne pivoté en portrait, liée avec le SDK 27.0, avec une taille de 669 par 703 points, des classes de taille regular et regular, un arrangement scindé côte à côte, et l'heure et l'état du Wi-Fi dans une bande noire en travers du haut

Pivotée, liée comme 27.0 : la bande en travers du haut appartient au système.

Ce que la bêta ne sait pas encore faire

Apple pose trois limites sous Simulator, Known Issues, dans les notes de la bêta, le long premier lancement, l’absence de StandBy et la plupart des extensions d’app : « Initial Simulator launch can take several minutes. » (187708500), « StandBy is unavailable in the iPhone Duo Simulator runtime. » (187708663) et « Running and debugging most app extensions is unavailable in the iPhone Duo Simulator runtime. » (187708767).2 La limite sur StandBy compte pour quiconque a des widgets ou des Live Activities prévus pour lui : l’annonce d’Apple dit que le téléphone « enters StandBy on either the outer or inner display » et parle d’un « hub for widgets », le billet Duo pour les développeurs détaille ce qui s’y affiche, et tant qu’une bêta ultérieure ne lève pas la limite, StandBy sur cet appareil reste à vérifier sur le matériel (15 octobre : les notes de la version finale la listent toujours15).11

Deux autres figurent sous Mac Catalyst, Known Issues, et elles mordent toute app qui adopte ces API et se compile aussi pour le Mac : « Projects that use APIs specific to iOS 27.1 show compile errors when building for Mac Catalyst (“undeclared identifier”, “not found”, “has no member”, “cannot find”, etc). (185924957) », avec le contournement d’Apple #if !targetEnvironment(macCatalyst) en Swift ou #if !TARGET_OS_MACCATALYST en Objective-C, et « Projects that target iOS 27.1 show no Mac Catalyst run destination available. (187046347) », avec « Add a Mac Catalyst 27.0 minimum deployment in target settings. » pour contournement.2 Les notes de la bêta Xcode 27.2 en ajoutent une troisième, venue de l’autre côté : « macOS, watchOS, tvOS, and visionOS SDKs in Xcode 27.2 incorrectly report 27.1 as a valid deployment target, » et « Mac Catalyst builds with a 27.1 or 27.2 deployment target may be unable to use newly introduced API. » (187160501).8

Ce que je ferais cette semaine

  1. Installez la bêta à côté de Xcode 27.0 plutôt que par-dessus : décompressez le xip, renommez l’app et faites pointer DEVELOPER_DIR dessus pour les compilations en ligne de commande ; rien dans les notes de la bêta ne change la toolchain 27.0, et le compilateur comme l’éditeur de liens portent des chaînes de version identiques.4
  2. Lancez le téléchargement du runtime avant d’en avoir besoin, avec xcodebuild -downloadPlatform iOS sous la bêta, et recommencez s’il échoue ; c’est le runtime qui rend le type d’appareil iPhone Duo amorçable, et Apple prévient que le premier lancement prend en plus plusieurs minutes.23
  3. Compilez une fois contre le SDK 27.1 avec votre cible Mac Catalyst incluse, et lisez les deux diagnostics que nomme Apple avant de décider s’il faut clôturer la nouvelle API avec #if !targetEnvironment(macCatalyst) ou relever le minimum Catalyst à 27.0.2
  4. Prenez les nombres du profil comme les tailles à prévisualiser et à tester : 466 par 678 points fermé, 669 par 951 ouvert, avec un écran interne nativement en paysage. La note Previews de la bêta ajoute un groupe Display au sélecteur de surcharges du canevas, « for previewing content on a device’s alternative display. » (182598534)25
  5. Lisez les régions réservées là où elles seront relues : dans le body de la vue via le proxy de géométrie, ou à chaque changement de géométrie, jamais une seule fois à la première mise en page. reservedRegions(kind:options:layoutDirectionBehavior:) avec .includeInactive n’a rien renvoyé lors des six à neuf premières évaluations de la sonde, puis, à chacune des suivantes, toutes les régions de l’écran (la caméra et la colonne d’état en position fermée ; la pliure, la caméra interne et la colonne d’état en position ouverte), si bien qu’une valeur mise en cache lors de la première passe reste un tableau vide pendant toute la vie de la vue. Et avant de vous fier à quoi que ce soit de tout cela, vérifiez que le build porte le tampon du SDK 27.1 : otool -l <app>/<binary> | grep -A4 LC_BUILD_VERSION.713

Questions fréquentes

Le simulateur iPhone Duo est-il dans Xcode 27.1 beta ?

Oui. La bêta installe un type d’appareil iPhone Duo, com.apple.CoreSimulator.SimDeviceType.iPhone-Duo, dont le profil exige un runtime iOS 27.1 que Xcode télécharge séparément via xcodebuild -downloadPlatform iOS. Les notes d’Apple préviennent que le premier lancement « can take several minutes » (peut prendre plusieurs minutes) et que StandBy ainsi que la plupart des extensions d’app sont indisponibles dans ce runtime.235

Comment obtenir le simulateur iPhone Duo ?

Installez Xcode 27.1 beta, téléchargez le runtime iOS 27.1 avec xcodebuild -downloadPlatform iOS sous la bêta, puis choisissez l’appareil iPhone Duo dans Device Hub, où les positions sont des boutons. La bêta 27.2 ne l’inclut pas ; les notes 27.2 d’Apple renvoient à la bêta 27.1 pour « the iOS SDK and simulator support for iPhone Duo. » (le SDK iOS et la prise en charge du simulateur pour l’iPhone Duo).238 (11 octobre : Xcode 27.1 RC (27A9275) est sorti le 5 octobre, et ses notes listent les mêmes Known Issues du simulateur iPhone Duo ; la bêta n’est donc plus le seul Xcode 27.1 dont les notes couvrent le simulateur Duo. Je n’ai pas installé la RC.14) (15 octobre : Xcode 27.1 est sorti en version finale, build 27A9275, le build de la RC, avec les deux mêmes Known Issues du simulateur Duo dans ses notes ; je ne l’ai pas installé.15)

Existe-t-il un simulateur iPhone Duo en ligne ?

Pas chez Apple. Le simulateur n’a été livré que dans Xcode 27.1 beta jusqu’à la RC, et il tourne sur le runtime iOS 27.1 d’Apple ; une page de navigateur qui porte ce nom dessine autre chose. Pour une vérification rapide de la mise en page, le canevas Previews de la bêta propose un groupe Display pour l’écran alternatif.2 (11 octobre : Xcode 27.1 RC (27A9275) est sorti le 5 octobre, et ses notes listent les mêmes Known Issues du simulateur iPhone Duo ; la bêta n’est donc plus le seul Xcode 27.1 dont les notes couvrent le simulateur Duo. Je n’ai pas installé la RC.14) (15 octobre : Xcode 27.1 est sorti en version finale, build 27A9275, le build de la RC, avec les deux mêmes Known Issues du simulateur Duo dans ses notes ; je ne l’ai pas installé.15)

Comment installer Xcode 27.1 beta à côté de Xcode 27 ?

Décompressez le xip avec xip --expand, déplacez l’app obtenue sous un nom versionné du type /Applications/Xcode-27.1-beta.app, et réglez DEVELOPER_DIR sur son dossier Contents/Developer pour xcodebuild, xcrun et swiftc. La bêta exige macOS Tahoe 26.6 ou plus récent, le même plancher que Xcode 27.0.24

Quelle est la taille de l’écran interne de l’iPhone Duo en points ?

669 par 951 points, d’après le profil d’appareil du simulateur, qui définit l’écran interne à 2007 par 2853 pixels en scale 3 avec une orientation nativement en paysage ; l’écran externe fait 466 par 678 points, issus de 1398 par 2034 pixels en scale 3.5

Xcode 27.1 beta modifie-t-il le SDK iOS 27.0 ou la toolchain de Xcode 27 ?

Non. Le compilateur Swift et l’éditeur de liens annoncent les mêmes chaînes de version que Xcode 27.0, et les notes de version de la bêta comptent trois sections, Mac Catalyst, Previews et Simulator, dont aucune ne touche à la toolchain. Le SDK iOS 27.1 est un ajout, identifié comme le build 24A94403 dans le SDK appareil comme dans le SDK simulateur.24

Quand l’iPhone Duo sort-il, et sous quel système ?

Le 23 octobre, sous iOS 27.1, d’après la news d’Apple du 16 septembre : « When iPhone Duo becomes available on October 23, it will run iOS 27.1. »9 (26 octobre : c’est ce qui s’est passé, et iOS 27.1 n’est sorti sur aucun autre appareil ; la page de sécurité d’Apple le liste pour le seul iPhone Duo, et le runtime de simulateur 27.1 de ce Mac n’accepte que le type d’appareil iPhone Duo.16)

À lire aussi sur ce site : le billet Duo pour les développeurs donne les chiffres de la fiche technique et la liste d’API que ce billet confronte au SDK, le billet sur la conception pour l’iPhone Duo lit les recommandations de design d’Apple, la liste de contrôle de l’iPhone redimensionnable est le travail de mise en page que nourrissent les chiffres du profil, le hub Xcode 27 porte les sections datées des bêtas, le billet sur les échecs de build de Xcode 27 couvre la chaîne d’outils que cette bêta laisse inchangée, et le billet sur les notes de version d’iOS 27 suit les builds 27.x.

Sources


  1. Apple, Releases, flux RSS récupéré le 19 septembre 2026 : « Xcode 27.1 beta (27A9269) » daté Fri, 18 Sep 2026 10:00:00 PDT et « TestFlight Update » daté Fri, 18 Sep 2026 14:00:00 PDT. Apple, notes de version d’App Store Connect, 18 septembre 2026, entrée TestFlight, citée intégralement. ↩↩↩↩

  2. Apple, Xcode 27.1 Beta Release Notes, récupérées via le point de terminaison JSON de la documentation le 19 septembre 2026 : Overview, cité ; Mac Catalyst, Known Issues 185924957 et 187046347 avec leurs contournements, cités ; Previews, New Features 182598534, cité ; Simulator, Known Issues 187708500, 187708663 et 187708767, cités. Les notes ne contiennent aucune autre section. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  3. Téléchargement du runtime par l’auteur sur macOS 26.6.2 (25G83), le 19 septembre 2026, avec DEVELOPER_DIR réglé sur Xcode 27.1 beta : xcodebuild -downloadPlatform iOS a affiché « iOS is already downloaded. » pour le runtime 27.0 installé, puis « Downloading iOS 27.1 Simulator (24A94401) (arm64) », suivi de DVTDownloadable: Download Failed. Downloadable: DVTDownloadable(identifier: 0a4e7582-0061-5907-bea9-fe234c1f9392, version: 27.1.0.1, category: simulator, contentType: cryptexDiskImage, downloadMethod: mobileAsset, platform: com.apple.platform.iphoneos) et de Error Domain=DVTDownloadableErrorDomain Code=41 "Download failed." ; la reprise, xcodebuild -downloadPlatform iOS -buildVersion 24A94401, a affiché « Downloading iOS 27.1 Simulator (24A94401) (arm64) : 0.0% (66 kB of 7.85 GB) » et est allée au bout, après quoi xcrun simctl list runtimes listait « iOS 27.1 (27.1 - 24A94401) - com.apple.CoreSimulator.SimRuntime.iOS-27-1 ». La page de téléchargement pour développeurs d’Apple, parcourue le même jour en étant connecté à la recherche de « Simulator Runtime », ne liste aucune image disque plus récente que la iOS 18.2 Simulator Runtime. ↩↩↩↩↩↩↩

  4. Inspection de /Applications/Xcode-27.1-beta.app par l’auteur, le 19 septembre 2026 : xcodebuild -version affiche Xcode 27.1 et Build version 27A9269 ; xcrun --sdk iphoneos --show-sdk-version et xcrun --sdk iphonesimulator --show-sdk-version affichent tous deux 27.1 ; le SystemVersion.plist des deux SDK porte ProductBuildVersion 24A94403 et ProductVersion 27.1 ; xcrun swift --version affiche Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1) et xcrun ld -v affiche ld-27037.1, les mêmes chaînes de version que celles qu’affiche Xcode 27.0 (27A266a) sur le même Mac. Xcode_27.1_beta.xip pèse 2 027 292 809 octets ; pkgutil --check-signature rapporte « signed Apple Software » avec une chaîne de certificats Software Update ; du -sk rapporte 3 813 336 KB pour l’app décompressée, contre 3 804 188 KB pour Xcode 27.0 (27A266a) décompressé dans /Applications/Xcode-27.app. Les décomptes de noms viennent de grep -c pour la sous-chaîne dans SwiftUICore.swiftmodule/arm64e-apple-ios.swiftinterface, SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterface et UIKit.swiftmodule/arm64e-apple-ios.swiftinterface du SDK iPhoneOS, et les décomptes de fichiers de grep -rl sur UIKit.framework/Headers ; les attributs de disponibilité sont lus dans ces mêmes fichiers : @available(anyAppleOS 27.1, *) au-dessus de public struct ArrangementView< dans l’interface SwiftUICore et au-dessus de l’extension SwiftUICore.View qui déclare func toolbarVerticalBehavior, API_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1)) suivi de API_UNAVAILABLE(watchos) dans UIArrangementViewController.h, sur les deux déclarations reservedRegionsOfKind: de UIView.h, et sur l’énumération UIVerticalBarEdge et le trait verticalBarEdge, et API_AVAILABLE(ios(27.1)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos, tvos) sur ses cas UIVerticalBarEdgeLeading et UIVerticalBarEdgeTrailing ; @available(anyAppleOS 27.0, *) au-dessus de func presentationPlacement ; @available(iOS 27.0, visionOS 27.0, *) au-dessus de public static let topBarPinnedTrailing et aucun attribut au-dessus de public static let cancellationAction. Premier lancement : le premier xcodebuild -version sous le DEVELOPER_DIR de la bêta a dépassé un délai d’attente de deux minutes, et /var/log/install.log enregistre xcodebuild mettant en file une installation PackageKit à 16:01:54 le 19 septembre, qui a extrait CoreTypes.pkg et XcodeSystemResources.pkg de Xcode-27.1-beta.app/Contents/Resources/Packages et s’est terminée à 16:03:04 ; xcodebuild -checkFirstLaunchStatus a ensuite renvoyé 0. ↩↩↩↩↩↩↩↩↩↩↩

  5. /Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone Duo.simdevicetype, installé par Xcode 27.1 beta et lu avec plutil -convert xml1 le 19 septembre 2026. profile.plist : modelIdentifier iPhone19,4, productClass V68, aliases com.apple.CoreSimulator.SimDeviceType.V68, minRuntimeVersion 27.1, createByDefaultForRuntimeVersions versionMin 27.1. capabilities.plist : ModelNumber A3447, ThinningProductType iPhone19,4, CompatibleDeviceFallback iPhone18,3, DeviceCornerRadius 59, HomeButtonType 2, DeviceSupportsDynamicIsland true, DeviceSupportsEnhancedMultitasking false, IsLargeFormatPhone true ; ScreenDimensionsCapability main-screen-width 1398, main-screen-height 2034, main-screen-pitch 460, main-screen-scale 3 ; displays : primary (displayName LCD, screenID 1, width 1398, height 2034, scale 3, hdpi et vdpi 460, refreshRate 60, nativeOrientation 0, cornerRadiusUL 8, UR 59, LL 8, LR 59, colorspace P3) et primary-1 (displayName LCD-1, screenID 3, width 2007, height 2853, scale 3, hdpi et vdpi 460, refreshRate 60, nativeOrientation 270, les quatre rayons de coin à 55, colorspace sRGB), plus external-0 (TVOut), wireless0 (carPlay) et resizable (scene). Les deux PDF désignés par framebufferMaskIdentifier ont été rendus avec qlmanage puis inspectés ; les valeurs de la fiche technique d’Apple pour les dalles figurent dans le billet Duo pour les développeurs. xcrun simctl list devicetypes liste sous la bêta « iPhone Duo (com.apple.CoreSimulator.SimDeviceType.iPhone-Duo) ». ↩↩↩↩↩↩↩↩↩

  6. Exécutions de l’auteur sur macOS 26.6.2 (25G83), les 19 et 20 septembre 2026. Appareil : simctl create "Duo-27.1" com.apple.CoreSimulator.SimDeviceType.iPhone-Duo com.apple.CoreSimulator.SimRuntime.iOS-27-1, démarré avec simctl boot et simctl bootstatus -b (environ une minute sur ce Mac) ; simctl io <udid> enumerate liste deux ports com.apple.framebuffer.display de classe d’affichage 0 à 1398 par 2034 et 2007 par 2853 et, sous Connected Screens, « LCD-1 » avec le nom d’appareil primary-1, l’identifiant d’écran 3 et la taille en pixels {2007, 2853}. Sonde : DuoProbe, une app SwiftUI d’un seul fichier compilée avec xcrun swiftc -sdk <iPhoneSimulator.sdk> -target arm64-apple-ios27.1-simulator -parse-as-library sous Xcode 27.1 beta, installée avec simctl install, lancée avec simctl launch --console-pty, captures d’écran avec simctl io <udid> screenshot --mask=alpha --display=primary et --display=primary-1. Lignes de console en position fermée : DUOPROBE screen=(466.0, 678.0) scale=3.0 idiom=0 model=iPhone name=Duo-27.1 ; DUOPROBE size=386x510 h=compact v=regular verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 0.0, bottom: 34.0, trailing: 0.0) ; DUOPROBE uikit bounds=(354.0, 44.0) divisions=0 occlusions=0 verticalBarEdge=UIVerticalBarEdge(rawValue: 0) ; aucune ligne division[ ni occlusion[. La capture --display=primary-1 est noire. Alimentation des écrans : simctl io <udid> screenConfig --display=primary power off a affiché « Screen 1 power state set to off » ; le simctl launch suivant a échoué avec FBSOpenApplicationServiceErrorDomain code 5, « The system shell probably crashed. » ; simctl shutdown puis boot ont récupéré l’appareil. Passages en position le 20 septembre, en deux séries, pressant toutes deux Rotate Right, Closed, Book et Open via l’API d’accessibilité avec l’action AXPress sur les boutons que Device Hub expose pour l’appareil sélectionné, et toutes deux pilotées par l’outil en ligne de commande simctl de la bêta 27.2, avec le DEVELOPER_DIR que ces scripts règlent, contre le runtime, le type d’appareil et le Device Hub de la bêta 27.1. Dans la première série, la sonde de la position précédente tournait encore quand le bouton suivant était pressé, puis elle était arrêtée et relancée, avec douze secondes de console capturées et des captures des deux écrans ; les relevés pivotés ci-dessus et les lignes de transition en viennent. Dans la seconde série, la sonde était arrêtée après chaque capture, de sorte qu’aucune app n’était au premier plan quand le bouton suivant était pressé ; les captures d’avant relance en viennent. Open : DUOPROBE size=803x515 h=regular v=regular verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 34.0, bottom: 20.0, trailing: 34.0), DUOPROBE uikit bounds=(771.0, 44.0) divisions=0 occlusions=0 verticalBarEdge=UIVerticalBarEdge(rawValue: 0) et DUOPROBE screen=(466.0, 678.0) ; la capture --display=primary-1 montre la sonde, --display=primary montre du noir. Book : les mêmes trois lignes après la relance ; la capture de l’écran interne prise après l’appui et avant la relance, sans app en cours, montre l’écran d’accueil. Closed : les lignes de position fermée ci-dessus. Après Rotate Right, Open : DUOPROBE size=669x703 h=regular v=regular verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 0.0, bottom: 34.0, trailing: 0.0) et uikit bounds=(637.0, 44.0), avec la capture de l’écran interne en portrait. Aucune exécution n’a affiché de ligne division[ ni occlusion[. Un état fermé pivoté n’est apparu que sous forme de lignes de transition pendant un changement de position, DUOPROBE size=610x232 h=compact v=compact ... screen=(678.0, 466.0), et n’est pas compté ci-dessus. Ce build était tamponné sdk 27.0 ; voir la mise à jour du 2 octobre et la note 13. ↩↩↩↩↩↩↩

  7. Apple, JSON de documentation récupéré le 19 septembre 2026 pour ArrangementView, UIArrangementViewController, reservedRegions(kind:options:layoutDirectionBehavior:), reservedRegions(kind:options:) et toolbarVerticalBehavior(_:) : la disponibilité par plateforme de chaque page indique iOS 27.1 et iPadOS 27.1, marqués bêta. Apple, Preparing your app for iPhone Duo, récupéré le même jour, pour les noms qu’emploie le guide. ↩↩↩↩

  8. Apple, Xcode 27.2 Beta Release Notes, récupérées le 19 septembre 2026, SDK, Known Issues, 187160501, cité ; récupérées à nouveau le 26 septembre 2026 pour l’encadré de l’Overview, « Download Xcode 27.1 beta to get the iOS SDK and simulator support for iPhone Duo. », cité. ↩↩↩

  9. Apple, « Get ready with the latest beta releases », news, 16 septembre 2026, « Note about iOS 27.1 and iPhone Duo », cité. ↩

  10. Apple, Designing for iPhone Duo, Human Interface Guidelines, récupéré via le point de terminaison JSON de la documentation le 20 septembre 2026 : « Controls on the side include both system and app elements: the Dynamic Island, the status bar, the toolbar (including navigation buttons), and the tab bar. » et « A hinge in the center lets people open and close the device » ; récupéré de nouveau le 2 octobre 2026, section Vertical controls : « The exception is the inner display in portrait, which has enough vertical space to keep standard horizontal bars. » ; section Anatomy : « The inner camera is behind the display and stays hidden until the camera is active. » ↩↩↩↩

  11. Apple Newsroom, Apple unveils iPhone Duo, 9 septembre 2026, récupéré le 20 septembre 2026 : « Set iPhone Duo down and it enters StandBy on either the outer or inner display » et « hub for widgets », cités dans le paragraphe sur StandBy. ↩

  12. Sven-Eric Molzahn, iphone-duo-probe, README GitHub récupéré le 24 septembre 2026 (dernier commit le 20 septembre 2026) : « Two caveats before reaching for it: reservedRegions is empty on the first geometry evaluation and populated on a later one » et « Half-folded, inner display, content 867 × 575, hinge band at x 455.5…495.5 », cités. Antoine van der Lee, iPhone Duo Simulator: Testing and optimizing your SwiftUI app, SwiftLee, 22 septembre 2026, cité. ↩↩↩

  13. Nouvelle mesure de l’auteur le 2 octobre 2026 : macOS 27.0 (26A428), Xcode 27.1 beta (27A9269), le runtime iOS 27.1 (24A94401), le même simulateur Duo-27.1. Sonde : DuoProbe2, un fichier Swift, un TabView dont le premier onglet contient un NavigationStack avec cinq éléments de barre d’outils, les relevés décrits dans le texte, et une vue UIKit qui journalise sa fenêtre, l’écran de sa scène de fenêtre, UIScreen.main et le trait verticalBarEdge. Compilée deux fois à partir de ce fichier avec le SDK du simulateur 27.1, en indiquant à l’éditeur de liens quelle version de SDK inscrire (-Xlinker -platform_version -Xlinker ios-simulator -Xlinker 27.1 -Xlinker 27.0 et ... 27.1) ; otool -l a affiché sdk 27.0 et sdk 27.1. Une troisième compilation à la manière de septembre, swiftc -sdk <iPhoneSimulator27.1.sdk> avec SDKROOT non défini, a affiché clang: warning: using sysroot for 'macOS 27.0' but targeting 'arm64-apple-ios27.1.0-simulator' et a été tamponnée sdk 27.0 ; avec SDKROOT exporté vers le SDK du simulateur, la même commande tamponne sdk 27.1. La vraie app qui a révélé la différence est Kiradex (941 Apps), compilée par Xcode 27.1 beta : minos 27.0, sdk 27.1. Lignes de console, tampon 27.1, fermée : size=382x562 ... h=compact v=regular verticalEdge=trailing safe=EdgeInsets(top: 82.0, leading: 0.0, bottom: 34.0, trailing: 84.0) divisions=0 occlusions=2, occlusion[0] active=true frame=(399,-52 37x37), occlusion[1] active=true frame=(382,-82 84x170), window=(466.0, 678.0), verticalBarEdge=2 ; fermée et pivotée : size=594x350 ... h=compact v=compact verticalEdge=trailing, window=(678.0, 466.0) ; ouverte : size=867x553 ... h=regular v=regular verticalEdge=trailing ... divisions=1 occlusions=2, division[0] active=false frame=(455,-82 40x669) margins=EdgeInsets(top: 0.0, leading: 20.0, bottom: 0.0, trailing: 20.0), occlusion[0] active=false frame=(677,-61 58x37), occlusion[1] active=true frame=(867,-82 84x120), window=(951.0, 669.0), hinge=fullyOpen 180 deg ; Book : la même chose avec division[0] active=true et hinge=partiallyOpen 127 deg, et mainScreen=(466.0, 678.0) à côté de sceneScreen=(951.0, 669.0) ; ouverte et pivotée : size=669x734 ... verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 0.0, bottom: 83.0, trailing: 0.0) divisions=1 occlusions=2, division[0] active=false frame=(0,321 669x40), occlusion[0] active=false frame=(611,543 37x58), occlusion[1] active=true frame=(535,-134 134x82), window=(669.0, 951.0), mainScreen=(466.0, 678.0), verticalBarEdge=0 ; Book et pivotée : la même chose avec division[0] active=true. Les cadres sont exprimés dans les coordonnées de la vue de relevé, dont l’origine se trouve 82 ou 134 points sous le haut de la fenêtre. Tampon 27.0 : window=(386.0, 678.0) fermée, (871.0, 669.0) ouverte et en Book, (669.0, 871.0) ouverte et pivotée, (678.0, 386.0) fermée et pivotée, avec verticalEdge=nil, verticalBarEdge=0 et divisions=0 occlusions=0 sur chaque ligne. PlainProbe, la même vue à onglets, la même pile de navigation et la même barre d’outils sans rien du SDK 27.1, compilée par Xcode 27.0 (27A266a) avec son propre SDK iOS 27.0 (otool : minos 27.0, sdk 27.0) : window=(386.0, 678.0) fermée et (871.0, 669.0) ouverte. À chaque lancement en 27.1, les six à neuf premières évaluations ont journalisé divisions=0 occlusions=0 avant que les régions n’apparaissent, dont trois avant que la vue n’ait une taille. L’occultation de la caméra a été comparée au PNG de contour « Outer Closed Portrait » d’Apple, dont la découpe de caméra s’étend de 400,3 à 436,3 points en largeur et de 29,7 à 65,7 en hauteur en 3x ; l’occultation s’étend de 399 à 436 et de 30 à 67 en points de fenêtre, à 1,3 point près sur chaque bord. Les positions des volets ont été mesurées sur les captures : à plat, le primaire de x 8 à 433,7 et le secondaire de 433,7 à 859 ; en Book, le primaire jusqu’à 455,7, une bande vide jusqu’à 495,7, le secondaire jusqu’à 859. La feuille de la sonde mesurait 653x501, centrée, en position ouverte et 459x501, contre le bord avant, en Book. Avec une option de lancement qui fait remplir la zone de contenu à la vue d’arrangement de la sonde, l’écran pivoté a affiché le volet primaire au-dessus du secondaire, et .split.axes(.horizontal) n’a affiché que le volet primaire. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  14. Apple, Releases, flux RSS récupéré le 11 octobre 2026 : « Xcode 27.1 RC (27A9275) » daté Mon, 05 Oct 2026 10:00:00 PDT. Apple, App Store Connect release notes, récupérées le 11 octobre 2026, entrée datée du 5 octobre 2026 : « You can now upload apps built with Xcode 27.1 RC using the SDK for iOS 27.1, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0, and watchOS 27.0 for the App Store, and for internal and external testing through TestFlight. » Apple, Xcode 27.1 RC Release Notes, récupérées le 11 octobre 2026, Simulator, Known Issues : « StandBy is unavailable in the iPhone Duo Simulator runtime. (187708663) » et « Running and debugging most app extensions is unavailable in the iPhone Duo Simulator runtime. (187708767) », comme dans les notes de la bêta. ↩↩↩↩

  15. Apple, Releases, flux RSS récupéré le 15 octobre 2026 à 17:16 heure du Pacifique (00:16 UTC, 16 octobre) : « Xcode 27.1 (27A9275) » daté Thu, 15 Oct 2026 13:00:00 PDT, le même numéro de build que l’élément RC du 5 octobre de la récupération du 11 octobre, que le flux ne contient plus. Apple, Xcode 27.1 Release Notes, récupérées via le point d’accès JSON de la documentation le 15 octobre 2026 à 17:21 heure du Pacifique, rebaptisées depuis « Xcode 27.1 RC Release Notes » ; Overview : « Xcode 27.1 includes Swift 6.4 and SDKs for iOS 27.1, iPadOS 27, tvOS 27, watchOS 27, macOS 27, and visionOS 27. » ; les deux Known Issues du simulateur de l’iPhone Duo, 187708663 et 187708767, inchangées. Apple, App Store Connect release notes, récupérées le 15 octobre 2026 à 17:20 heure du Pacifique, entrée datée du 15 octobre 2026, « App Store Connect updates » : « You can now upload apps built with Xcode 27.1 using the SDK for iOS 27.1, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0, and watchOS 27.0 for the App Store, and for internal and external testing through TestFlight. » et « Submit your iPhone Duo optimized apps and games in App Store Connect today. Starting April 2027, any apps or games submitted will need to include screenshots for iPhone Duo. » Le flux d’actualités développeur d’Apple, récupéré dans la même heure, ne contient aucun élément sur cette version. ↩↩↩↩↩

  16. Apple Newsroom, « iPhone Duo arrives at Apple Store locations worldwide », 23 octobre 2026, récupéré le 26 octobre : « On Friday, October 23, the highly anticipated iPhone Duo made its debut at Apple Store locations worldwide. » Assistance Apple, « Apple security releases », récupérée le 26 octobre 2026 : la ligne « iOS 27.1 », « This update has no published CVE entries. », « iPhone Duo », « 23 Oct 2026 », sans lien. Apple, Releases, flux RSS récupéré le 26 octobre 2026 à 16:12 heure du Pacifique : « iOS 27.2 (24B91020) » et « iOS 27.2 (24B119) » datés Mon, 26 Oct 2026 10:00:00 PDT ; « Xcode 27.2 RC (27B48) » daté Mon, 19 Oct 2026, l’élément Xcode le plus récent ; aucun titre d’élément ne nomme une version iOS 27.1. L’index iOS & iPadOS Release Notes, récupéré le 26 octobre, liste uniquement « iOS & iPadOS 27 Release Notes » et « iOS & iPadOS 27.2 Release Notes » ; le point d’accès JSON de la page 27.1 a renvoyé une 404. Apple, Xcode 27.2 RC Release Notes, récupérées le 26 octobre 2026 (Last-Modified Mon, 19 Oct 2026 04:56:10 GMT) : Device Hub, Known Issues (187146039, 187148389, 189465196 avec contournement) ; Mac Catalyst, Known Issues (185924957) ; Simulator, Resolved Issues (190155353) ; citées. Apple, iOS & iPadOS 27.2 Release Notes, récupérées le 26 octobre 2026 : UIKit, New Features (186294594). Mac de l’auteur, 26 octobre 2026, macOS 27.0 (26A428), Xcode 27.1 (27A9275) dans /Applications/Xcode.app : iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist et le plist du SDK iPhoneSimulator indiquent tous deux ProductVersion 27.1 et ProductBuildVersion 24A94232 ; xcrun simctl list runtimes affiche « iOS 27.1 (27.1 - 24A94425) » et -j liste une seule entrée supportedDeviceTypes, « iPhone Duo » ; xcrun simctl create de com.apple.CoreSimulator.SimDeviceType.iPhone-16-Pro sur com.apple.CoreSimulator.SimRuntime.iOS-27-1 a échoué avec « Incompatible device » (SimError 403) ; la sonde des marges et ses sorties figurent dans la note 4 du billet sur les notes de version d’iOS 27.2. ↩↩

Articles connexes

Préparer votre app pour l'iPhone Duo : un exemple complet

Préparer et soumettre une app pour l'iPhone Duo : le tampon de SDK qui active la mise en page, une vraie app dans chaque…

93 min de lecture

Notes d'iOS 27.2 : ce qui sort, et où est passé 27.1

iOS 27.2 (24B119) est sorti le 26 octobre : 2 nouveautés, 5 correctifs, 7 problèmes connus, 162 CVE, et un iOS 27.1 rése…

47 min de lecture

Des structures en pixel art : maisons, halls et intérieurs sur iPhone

Comment Pokémon, les RPG SNES et Stardew bâtissent maisons, intérieurs et étages, mesuré dans le code, et comment la vil…

102 min de lecture