Notes de version d'iOS 27.0 : dépréciations, ruptures et correctifs
iOS 27.0 et iPadOS 27.0 sont sortis le lundi 14 septembre 2026 sous le build 24A437, le même build qu’Apple avait publié comme RC le 11 septembre, avec le SDK inclus dans Xcode 27 (27A266a) le même jour et App Store Connect qui accepte les builds des SDK 27.0 GA depuis cette même date.13 Trois numéros de build répondent désormais à la question « quel iOS 27.0 ? » : l’appareil exécute 24A437, le SDK de Xcode 27 s’identifie comme 24A430 et le runtime du simulateur est 24A434.4 Les notes couvrent 93 sections avec 65 nouveautés, 197 problèmes résolus, 23 problèmes connus et 11 dépréciations ; ce qui compte pour le code existant, c’est l’ensemble des changements qui s’appliquent dès que vous compilez avec le SDK 27.0, les dépréciations confirmées par les en-têtes du SDK lui-même, et un correctif de Foundation qu’un seul binaire reproduit sur un runtime iOS 26.5 et sur un runtime iOS 27.0.24 {.answer-block}
L’essentiel
- Les builds. Appareil 24A437, SDK 24A430, runtime du simulateur 24A434 ; la RC et la GA partagent le même build appareil, et le numéro du SDK n’est pas celui de l’appareil, ce qui compte quand un rapport de bug en demande un.14
- Le comportement lié au SDK 27. 12 catégories de changements, 23 entrées en tout, modifient ce que fait une app dès que vous la compilez avec le SDK 27.0 : l’obligation d’écran de lancement, l’obligation du cycle de vie par scènes,
TabViewqui plante sur une sélection masquée, la sélection de texte système sur unTextsélectionnable, l’héritage des traits pour les view controllers présentés, la barre de portée en ligne, les scènes d’écran externe qui ne sont plus proposées automatiquement, les modificateurs de contrôle réinitialisés dans les sheets et les popovers, le calcul de zone sûre decontainerRelativeFrame, les accesseurs de barre d’état, les règles de redimensionnement iPad sousUIRequiresFullScreen, et deux petits changements SwiftUI dans les menus et le défilement vers le haut.2 - Recompiler ou planter.
HitchTimeMetric.ratiode MetricKit mesure désormais dans une nouvelle unitéHitchTimeRatio, etScrollHitchTimeMetrica quitté l’API Swift ; Apple demande de recompiler avec le dernier SDK pour éviter des plantages au lancement et un plantage pour symbole manquant, et l’interface du SDK confirme que le type a disparu.24 - 11 dépréciations, pour la plupart silencieuses.
canOpenURL:(ios(3.0, 27.0)dans l’en-tête), On Demand Resources (ios(9.0, 27.0)),PHAssetResource.originalFilename(ios(9, 27)), les API MetricKit d’origine (marquéesAPI_TO_BE_DEPRECATED, donc une dépréciation douce),ScrollHitchTimeMetric,FileDocument,calendar.deleteEventsrenommé encalendar.deleteEvent, un renommage dans PencilKit, l’obligation des scènes, AirPort Utility et une note de langue sur Weather Highlights. Les trois dépréciations dures n’avertissent qu’avec une cible de déploiement 27.0 ; à 17.0 ou 26.0, le même fichier compile sans un mot.24 - Deux changements Foundation, testés.
+[NSURL URLWithString:]ne double-encode plus un%20valide lorsqu’il échappe une espace ailleurs dans la chaîne : un seul binaire simulateur produit%2520sur un runtime iOS 26.5 et%20sur le runtime iOS 27.0, et le build Mac se range du côté ancien, donc le correctif suit l’OS et non le SDK. La troncature devolumeAvailableCapacityKeyà trois chiffres significatifs ne se voit pas dans le simulateur, qui rapporte exactement 55 177 985 blocs.24
Quel build est lequel ?
| Où | Build | Preuve |
|---|---|---|
| Appareil, iOS 27.0 / iPadOS 27.0 | 24A437 | Flux Releases, Mon, Sep 14, 2026 ; « iOS 27.0 RC (24A437) » le Fri, Sep 111 |
| SDK inclus dans Xcode 27 (27A266a) | 24A430 | iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist, ProductBuildVersion4 |
| Runtime du simulateur iOS 27.0 | 24A434 | xcrun simctl list runtimes affiche « iOS 27.0 (27.0 - 24A434) »4 |
| macOS 27.0 | 26A428 | Flux Releases, Mon, Sep 141 |
| App Store Connect | SDK 27.0 GA acceptés | « You can now upload apps built with Xcode 27 using the SDK for iOS 27.0, 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. » (Vous pouvez désormais envoyer des apps compilées avec Xcode 27 et les SDK 27.0 vers l’App Store et pour les tests TestFlight.) 14 septembre ; les envois compilés avec les SDK RC sont acceptés depuis le 9 septembre3 |
Les trois numéros ne sont pas une erreur. Le SDK est un instantané d’en-têtes et d’interfaces, le runtime du simulateur est un cryptex séparé qu’Apple livre à Xcode, et le build appareil est ce que les gens exécutent ; une reproduction qui dit « iOS 27.0 » sans préciser lequel omet justement le numéro qui décide si un correctif s’est appliqué.4
Les notes elles-mêmes s’ouvrent sur deux phrases de périmètre, « The iOS & iPadOS 27 SDK provides support to develop apps for iPhone and iPad running iOS & iPadOS 27. The SDK comes bundled with Xcode 27, available from the Mac App Store » (le SDK iOS et iPadOS 27 sert à développer des apps pour iPhone et iPad sous iOS et iPadOS 27 et est fourni avec Xcode 27, disponible sur le Mac App Store), puis parcourent 93 sections. En comptant les éléments de liste sous chaque titre, on obtient 65 nouveautés, 197 problèmes résolus, 23 problèmes connus et 11 dépréciations ; Siri à elle seule totalise 38 résolus et huit connus, SwiftUI 23 nouveautés et 13 résolus, UIKit neuf nouveautés et 13 résolus.2 Le billet sur Xcode 27 couvre le côté outillage, et le billet que vous lisez couvre le côté OS et SDK.
Qu’est-ce qui change dès que vous compilez avec le SDK 27.0 ?
Apple conditionne les changements de comportement au SDK contre lequel une app est liée, donc ils ne touchent pas au build que vous avez déjà livré et s’appliquent tous à la première archive produite par Xcode 27. En citant la note de chacun :2
- Écran de lancement. « iOS and iPadOS apps built with the 27.0 SDK or later are required to include a launch screen. Your app’s
Info.plistmust contain one of the following keys :UILaunchStoryboardName,UILaunchStoryboards,UILaunchScreen, orUILaunchScreens. Apps that don’t include a launch screen are rejected when the App Store begins accepting apps built with the 27.0 SDK. » (Les apps compilées avec le SDK 27.0 ou ultérieur doivent inclure un écran de lancement ; l’Info.plistdoit contenir l’une des quatre clés citées, faute de quoi l’App Store rejette l’app dès qu’il accepte les builds du SDK 27.0.) App Store Connect a accepté les envois vers l’App Store compilés avec les SDK 27.0 RC à partir du 9 septembre et avec les SDK GA à partir du 14 septembre ; aucune des deux entrées ne dit quand les rejets ont commencé, lisez donc les deux comme des dates d’envoi plutôt que comme une date d’application.3 Mon billet sur l’écran de lancement audite un plist généré. - Cycle de vie par scènes. Sous les dépréciations UIKit : « Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch. » (Les apps compilées avec le dernier SDK doivent adopter le cycle de vie par scènes, sinon elles ne se lancent pas.) Le billet sur l’obligation des scènes contient la migration.
- Sélection de
TabView. « In apps built with the iOS 27.0 and iPadOS 27.0 SDKs, aTabViewenforces that its selection is set to a visible tab.TabViewmight crash when its selection is set to a hidden or otherwise unavailable tab. » (UnTabViewexige désormais que sa sélection pointe vers un onglet visible et peut planter si elle pointe vers un onglet masqué ou indisponible.) Une sélection restaurée depuisUserDefaultsqui nomme un onglet que vous avez masqué depuis est le cas à chercher. Textsélectionnable. « In apps built with the iOS 27.0 and iPadOS 27.0 SDKs, aTextview with.textSelection(.enabled)applied now supports user-interactive selection using the system text selection UI. » (Une vueTextavec.textSelection(.enabled)utilise désormais l’interface de sélection de texte du système.) Apple ajoute que de telles vues « might include additional gestures for system text selection interactions » (peuvent inclure des gestes supplémentaires pour la sélection de texte système) et oriente les gestes personnalisés vers.highPriorityGesture(); le même build fait aussi fonctionnerTextRenderersur unTextsélectionnable.- View controllers présentés. « In apps built with the iOS 27.0 SDK, a presented view controller inherits its trait collection by walking up its view’s superview chain through the intermediate views of the presentation, rather than jumping directly to the presentation controller. » (Un view controller présenté hérite désormais sa trait collection en remontant la chaîne des superviews à travers les vues intermédiaires de la présentation, au lieu de sauter directement au presentation controller.) Les sous-classes personnalisées de
UIPresentationControllerqui définissent des traits sont celles à retester. - Barre de portée. « In apps built with the iOS 27.0 SDK, when
UISearchControlleruses center search-bar placement, the scope bar appears inline on the same row as the search field rather than on a separate row beneath it. » (QuandUISearchControllerplace la barre de recherche au centre, la barre de portée apparaît sur la même ligne que le champ de recherche, et non sur une ligne séparée en dessous.) - Écrans externes. « In apps built with the iOS 27.0 SDK,
windowExternalDisplayNonInteractivescenes are no longer offered automatically by the system. UseUIViewController.registerSceneAccessory(_:)with aUISceneAccessory.externalNonInteractiveinstance to display non-interactive content on external display scenes. » (Le système ne propose plus automatiquement les scèneswindowExternalDisplayNonInteractive; utilisezUIViewController.registerSceneAccessory(_:)avec une instanceUISceneAccessory.externalNonInteractivepour afficher du contenu non interactif sur un écran externe.) SwiftUI reçoit la même porte via.sceneAccessoryavec unExternalNonInteractiveAccessory. - Sheets et popovers. Listé comme corrigé : « In apps built with the 27.0 SDKs, the
controlSize,buttonSizing,buttonRepeatBehavior,menuIndicatorVisibility, andButtonBorderShapeenvironment values are now reset to their default values in sheets and popovers. » (Ces valeurs d’environnement sont désormais réinitialisées à leurs valeurs par défaut dans les sheets et les popovers.) Si un sheet héritait.controlSize(.large)de son présentateur, ce n’est plus le cas. containerRelativeFrame. Également corrigé pour les builds du SDK 27.0 : il « incorrectly accounts for safe-area insets on aScrollView’s non-scrollable axis, causing the calculated scrollable content size to be too small » (prend à tort en compte les marges de zone sûre sur l’axe non défilable d’unScrollView, ce qui rend la taille de contenu défilable calculée trop petite), donc unScrollViewhorizontal aveccontainerRelativeFrame(.vertical)change de taille.- Accesseurs de barre d’état. Corrigé pour les builds du SDK 27.0 : les accesseurs de barre d’état obsolètes de
UIApplication, que la note liste commestatusBarFrame,statusBarOrientation,statusBarStyleetisStatusBarHidden, « might return NaN or null values » (peuvent renvoyer NaN ou des valeurs nulles). - Redimensionnement et orientation sur iPad et en Recopie de l’iPhone. Neuf problèmes résolus d’UIKit décrivent ce qu’une app « built with the iOS 27 SDK » (compilée avec le SDK iOS 27) devrait désormais observer quand sa scène se connecte, ou quand l’utilisateur redimensionne ou fait pivoter sa fenêtre : les apps
UIRequiresFullScreenreçoivent « a discrete change to a newUIScreenwith an updated bounds » (un changement discret vers un nouvelUIScreenaux bounds mis à jour) au lieu de mises à jour continues, les bounds deUIScreen.main« should remain fixed once the screen connects » (devraient rester fixes une fois l’écran connecté), et « supported interface orientations should no longer be a condition for continuous resizability » (les orientations prises en charge ne devraient plus conditionner le redimensionnement continu). - Menus et défilement vers le haut. Deux petits changements SwiftUI : « In apps built with the 27.0 SDKs, a
LabeledContentview used inside aMenumaps its value to the platform menu item’s subtitle » (unLabeledContentutilisé dans unMenufait de sa valeur le sous-titre de l’élément de menu de la plateforme), et, listé comme corrigé, « In apps built with the 2027 SDKs, tapping the status bar to scroll aScrollViewto its top correctly updates a boundscrollPosition» (toucher la barre d’état pour ramener unScrollViewen haut met correctement à jour unescrollPositionliée). Une étiquette de menu qui portait une valeur pour des raisons de mise en page gagne désormais un sous-titre, et une liaisonscrollPositionqui restait périmée après un toucher sur la barre d’état se met désormais à jour.
Ces 12 catégories couvrent les entrées qui changent un comportement existant. Les nouvelles capacités derrière la même barrière de SDK, comme le protocole ReadableDocument, le protocole Document bâti dessus et UIScene.extendStateRestoration, figurent dans les sections suivantes ; la catégorie des écrans externes associe le retrait UIKit à son remplacement SwiftUI.
Deux entrées MetricKit ont leur place ici même si elles parlent de recompilation plutôt que de liaison. « HitchTimeMetric.ratio and SignpostIntervalMetric.hitchTimeRatio now use the new HitchTimeRatio type, a Dimension subclass that expresses hitch time as a ratio of milliseconds hitching per second of tracked duration. Recompile your app with the latest SDK to pick up this type change and avoid any crashes on launch. » (Ces deux propriétés utilisent désormais le nouveau type HitchTimeRatio, une sous-classe de Dimension qui exprime le temps de saccade en millisecondes par seconde de durée suivie ; recompilez avec le dernier SDK pour adopter ce changement de type et éviter les plantages au lancement.) Et : « The scrollHitchTime(_:) case of MetricResult and the ScrollHitchTimeMetric type are no longer part of the new Swift MetricKit API, and MetricReport values no longer contain scroll hitch entries. Use the hitchTime(_:) case and HitchTimeMetric instead, which report per-app animation hitch time. Recompile your app with the latest SDK to avoid a missing symbol crash if it references ScrollHitchTimeMetric or scrollHitchTime(_:). » (scrollHitchTime(_:) et ScrollHitchTimeMetric ne font plus partie de la nouvelle API Swift de MetricKit, et les valeurs MetricReport ne contiennent plus d’entrées de saccade au défilement ; utilisez hitchTime(_:) et HitchTimeMetric à la place et recompilez avec le dernier SDK pour éviter un plantage pour symbole manquant.)2 Dans l’interface Swift de MetricKit du SDK iOS 27, ScrollHitchTimeMetric et scrollHitchTime apparaissent zéro fois et HitchTimeRatio quatre fois, donc un binaire compilé contre le SDK bêta qui utilisait l’un ou l’autre nom référence un symbole que l’interface GA n’exporte pas.4 Mon billet sur MetricKit couvre la nouvelle API depuis la bêta de juin.
Quelles API sont obsolètes dans 27.0 ?
Les notes listent 11 dépréciations. Une dépréciation dans une note de version est une phrase ; une dépréciation dans le SDK est une annotation de disponibilité que le compilateur lit, et les deux ne disent pas toujours la même chose. J’ai confronté chaque entrée aux en-têtes et aux interfaces Swift du SDK iPhoneOS 27.0 de Xcode 27 :24
| Entrée de la note | Ce que dit le SDK |
|---|---|
« canOpenURL: is deprecated. Attempt to open the URL and handle any failure instead of validating it first. » (canOpenURL: est obsolète ; tentez d’ouvrir l’URL et gérez l’échec au lieu de la valider d’abord.) |
API_DEPRECATED("Prefer attempting to open URLs and handling any failures", ios(3.0, 27.0), visionos(1.0, 27.0), tvos(9.0, 27.0)) dans UIApplication.h ; le billet sur canOpenURL donne le schéma de remplacement |
« On Demand Resources and the NSBundleResourceRequest API are deprecated. Use Background Assets instead. » (On Demand Resources et l’API NSBundleResourceRequest sont obsolètes ; utilisez Background Assets à la place.) |
API_DEPRECATED("Use Background Assets instead.", ios(9.0, 27.0), watchos(2.0, 27.0), tvos(9.0, 27.0)) sur la classe, ses méthodes de priorité de conservation et ses constantes de notification et de priorité ; le billet sur ODR chiffre la migration, et la réponse « Ce que vous obtenez, c’est un avertissement du compilateur » de sa FAQ porte désormais la réserve sur la cible de déploiement expliquée à la section suivante |
« The originalFilename property on PHAssetResource is incorrectly marked as non-nullable, which misrepresents the property value ; a new, nullable filename property is available as a replacement. » (La propriété originalFilename de PHAssetResource est marquée à tort non nullable, ce qui déforme sa valeur ; une nouvelle propriété nullable filename la remplace.) |
originalFilename est API_DEPRECATED("Use filename instead", ios(9, 27), macos(10.15, 27), tvos(10, 27), visionos(1, 27)) ; filename est nullable et API_AVAILABLE(macos(27), ios(27), tvos(27), visionos(27)) |
Les API MetricKit d’origine, MXMetricManager, MXMetricManagerSubscriber, MXMetricPayload et MXDiagnosticPayload, « are no longer recommended for new adoption. Use MetricManager instead. » (ne sont plus recommandées pour les nouvelles adoptions ; utilisez MetricManager à la place.) |
API_DEPRECATED("Use MetricManager instead.", ios(13.0, API_TO_BE_DEPRECATED), macos(12.0, API_TO_BE_DEPRECATED)) sur MXMetricManager : une dépréciation douce sans version, donc aucun avertissement aujourd’hui. La page de référence d’Apple pour la classe la donne obsolète en 27.0 sur toutes les plateformes, la documentation et l’en-tête se contredisent donc ; mon billet sur MetricKit avait repris la version de la page et porte désormais une note datée sur cet écart6 |
ScrollHitchTimeMetric et scrollHitchTime(_:) « are no longer part of the new Swift MetricKit API » (ne font plus partie de la nouvelle API Swift de MetricKit) |
Zéro occurrence de l’un ou l’autre nom dans MetricKit.swiftmodule ; pas obsolètes, retirés |
« The FileDocument protocol is deprecated. Use ReadableDocument for read-only documents or Document for documents that support reading and writing. » (Le protocole FileDocument est obsolète ; utilisez ReadableDocument pour les documents en lecture seule ou Document pour ceux qui se lisent et s’écrivent.) |
FileDocument : deprecated: 100000.0, message: "Conform your type to Document instead." ; ReferenceFileDocument : "Use Document protocol instead." ; les deux sont douces, et Document est @available(iOS 27.0, macOS 27.0, visionOS 27.0, *), le remplacement exige donc un plancher à 27 |
« The calendar.deleteEvents schema has been renamed to calendar.deleteEvent. » (Le schéma calendar.deleteEvents a été renommé en calendar.deleteEvent.) |
deleteEvents apparaît zéro fois dans AppIntents.swiftmodule ; deleteEvent: some AppSchemaIntent y figure. Un renommage sans alias est une erreur de compilation pour quiconque garde l’ancien nom |
« __PKStrokeRenderState has been renamed to PKStrokeRenderStateReference, with PKStrokeRenderStateReference.init(…) replacing PKStrokeRenderState.asObjCRenderState(). » (__PKStrokeRenderState a été renommé en PKStrokeRenderStateReference, et PKStrokeRenderStateReference.init(…) remplace PKStrokeRenderState.asObjCRenderState().) |
PKStrokeRenderState.h déclare @interface PKStrokeRenderState sous API_AVAILABLE(ios(27.0), macos(27.0), visionos(27.0)) avec NS_SWIFT_NAME(PKStrokeRenderStateReference) ; l’interface Swift n’a aucun asObjCRenderState ; le remplacement nommé par Apple est l’init(_ swiftValue: PKStroke.RenderState) de la classe de référence, donc PKStrokeRenderStateReference(state) est la nouvelle forme d’appel et l’ancienne ne compile pas |
| « Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch. » (Les apps compilées avec le dernier SDK doivent adopter le cycle de vie par scènes, sinon elles ne se lancent pas.) | Pas une annotation ; un échec au lancement. Voir le billet sur l’obligation des scènes |
| « AirPort Utility will no longer be available for new downloads from the App Store. » (AirPort Utility ne sera plus proposé en nouveau téléchargement sur l’App Store.) Les retéléchargements fonctionnent encore ; « functionality is not guaranteed » (le fonctionnement n’est pas garanti) sous iOS 27 | Une app, pas une API |
| « Weather Highlights is currently only available in US English. » (Weather Highlights n’est pour l’instant disponible qu’en anglais américain.) | Apple la classe sous Deprecations ; elle se lit comme une note de disponibilité |
Une dépréciation douce et un renommage se trouvent hors des titres Deprecations. Le style de champ de texte .roundedBorder porte dans l’interface SwiftUI une annotation deprecated: 100000.0 dont le message, sans ses accents graves internes, se lit « Use textFieldStyle(.bordered) with textInputBorderShape(.roundedRectangle) » ; il correspond à l’entrée des nouveautés qui introduit TextInputBorderShape. La version 100000.0 est la convention d’Apple pour « obsolète, mais pas encore » : avec les réglages par défaut du compilateur, celui-ci reste muet, et le message n’apparaît que dans l’interface. Le renommage est plus dur. UINavigationItem.navigationBarMinimization « replaces UINavigationItem.barMinimizeBehavior and UINavigationItem.barMinimizationSafeAreaAdjustment » (remplace ces deux anciennes propriétés), et toolbarMinimizationBehavior de SwiftUI remplace toolbarMinimizeBehavior de la même façon ; aucun des trois anciens noms n’apparaît dans les en-têtes UIKit du SDK 27.0 ni dans les interfaces Swift d’UIKit et de SwiftUI, donc le code qui s’en sert échoue à la compilation au lieu d’avertir, la même catégorie que deleteEvents.24
Les dépréciations dures sont elles aussi plus discrètes qu’il n’y paraît. Le compilateur compare la version de dépréciation à votre cible de déploiement, pas au SDK, donc ios(3.0, 27.0) ne produit un avertissement que dans une cible dont l’iOS minimal est 27.0. J’ai compilé trois fois contre le SDK 27 un fichier qui appelle canOpenURL, crée un NSBundleResourceRequest et lit originalFilename : à -target arm64-apple-ios17.0-simulator et à 26.0, il a compilé sans diagnostic, et à 27.0 il a produit trois avertissements, 'canOpenURL' was deprecated in iOS 27.0: Prefer attempting to open URLs and handling any failures, 'NSBundleResourceRequest' was deprecated in iOS 27.0: Use Background Assets instead. et 'originalFilename' was deprecated in iOS 27: Use filename instead.4 Une app avec un plancher réaliste n’entendra parler d’aucune d’elles par le compilateur ; avec les réglages par défaut, le grep de la liste de contrôle ci-dessous est le seul avis que vous recevrez.
Quels correctifs ai-je vérifiés ?
Deux entrées Foundation se lancent au lieu de se lire. Les notes listent la première comme corrigée : « +[NSURL URLWithString:] no longer double-encodes the % of valid percent-escape sequences when encoding other invalid characters. » (+[NSURL URLWithString:] ne double-encode plus le % des séquences d’échappement pourcent valides lorsqu’il encode d’autres caractères invalides.)2 La sonde construit NSURL(string:) à partir de trois chaînes qui contiennent chacune un échappement valide et un caractère que NSURL doit échapper, puis affiche absoluteString. Je l’ai compilée deux fois avec Xcode 27 : une fois pour le Mac, une fois pour le simulateur avec un iOS minimal de 26.0, puis j’ai exécuté ce seul binaire simulateur, inchangé, sur un runtime iOS 26.5 et sur le runtime iOS 27.0 :4
| Entrée | macOS 26.6.2, et le binaire simulateur sur iOS 26.5 (identiques) | Le même binaire simulateur sur iOS 27.0 (24A434) |
|---|---|---|
https://example.com/a%20b c |
https://example.com/a%2520b%20c |
https://example.com/a%20b%20c |
https://example.com/search?q=caf%C3%A9 au lait |
https://example.com/search?q=caf%25C3%25A9%20au%20lait |
https://example.com/search?q=caf%C3%A9%20au%20lait |
https://example.com/p%20q{r |
https://example.com/p%2520q%7Br |
https://example.com/p%20q%7Br |
La première colonne est l’ancien comportement : NSURL échappe l’espace, et transforme aussi en %25 le % d’un échappement déjà valide, si bien que le chemin obtenu diffère de celui que l’échappement désignait. La colonne iOS 27.0 est le correctif. Un seul Mach-O, dont le LC_BUILD_VERSION indique minos 26.0 et sdk 27.0, a produit les deux colonnes simulateur, donc c’est le système d’exploitation sur lequel le code s’exécute qui décide du résultat, pas le SDK contre lequel vous compilez ni la cible pour laquelle vous compilez. Une app que vous compilez aujourd’hui garde l’ancien encodage sur le runtime iOS 26.5 que j’ai testé, et la note de version ne donne aucune raison d’attendre un résultat différent sur une autre version 26.x.
Les notes listent la seconde comme nouveauté, et je n’ai pas pu la reproduire là où je peux exécuter du code : « volumeAvailableCapacityKey is truncated to 3 significant decimal digits at the block count level (e.g., 123,456,789 blocks becomes 123,000,000 blocks). » (volumeAvailableCapacityKey est tronqué à trois chiffres significatifs au niveau du nombre de blocs, par exemple 123 456 789 blocs deviennent 123 000 000 blocs.)2 Dans le simulateur iOS 27.0, URL.resourceValues(forKeys: [.volumeAvailableCapacityKey]) a renvoyé 226 009 026 560 octets, et statfs sur le même chemin a renvoyé f_bavail 55 177 985 pour f_bsize 4 096, ce qui, multiplié, donne exactement le même chiffre ; un nombre de blocs à trois chiffres significatifs aurait été 55 100 000 blocs, soit 225 689 600 000 octets.4 Le Mac hôte a rapporté 55 177 998 blocs avec le même code. Ma lecture est que la troncature vit dans le noyau de l’appareil plutôt que dans Foundation, et que le simulateur, qui interroge le noyau du Mac sur le volume du Mac, ne peut pas la montrer ; je n’ai pas lancé la sonde sur un appareil, traitez donc l’entrée comme non testée plutôt que fausse, et attendez-vous à voir l’arrondi apparaître dans les rapports d’espace libre des appareils, jusqu’ici exacts.
Quelles nouveautés changent le code que vous avez déjà ?
L’historique limité de HealthKit. La note tient en une ligne, « Updated HealthKit permissions flow now lets users grant apps access to limited history or full history » (le nouveau flux d’autorisation HealthKit permet aux utilisateurs d’accorder aux apps un historique limité ou complet), et la référence de l’API en porte les conséquences.25 Après l’écran des types de données, « a second screen prompts them to choose how much historical data to grant your app, either a recent limited window or their full history » (un second écran leur demande quelle profondeur d’historique accorder à votre app, une fenêtre récente limitée ou l’historique complet), et « Time-bound authorization applies only to sample types » (l’autorisation bornée dans le temps ne s’applique qu’aux types d’échantillons).5 Le nouveau earliestAuthorizedSampleDate(for:), disponible à partir d’iOS 27.0 et de watchOS 27.0, renvoie un dictionnaire de HKObjectType vers la date lisible la plus ancienne, et la limite n’est pas là où vous l’imaginez : « HealthKit evaluates the boundary against a sample’s end date, so the framework might service your query with a sample that begins before the earliest authorization date as long as the sample ends after it. » (HealthKit évalue la limite par rapport à la date de fin d’un échantillon ; le framework peut donc servir à votre requête un échantillon qui commence avant la date d’autorisation la plus ancienne, pourvu qu’il se termine après.)45 La règle de confidentialité tient : « Your app can’t distinguish between denied and full access ; limited authorization is the only state your app can identify, by design. » (Votre app ne peut pas distinguer un accès refusé d’un accès complet ; l’autorisation limitée est, par conception, le seul état qu’elle peut identifier.)5 La consigne d’Apple est de traiter tout ce qui précède la date renvoyée comme inconnu plutôt qu’absent, et de borner la date de début de chaque requête par type. Toute tendance, ligne de base ou série calculée depuis HealthKit doit désormais rester correcte sur une fenêtre choisie par l’utilisateur. Le billet sur HealthKit couvre les ajouts de juin et ne couvre pas le changement du modèle d’autorisation.
Codes promotionnels StoreKit. « Offer code redemption APIs now return a VerificationResult when redemption completes. If a redemption succeeds, your app receives a VerificationResult that contains a Transaction object. If a redemption fails, your app receives an error that describes what caused the redemption to fail. » (Les API d’utilisation des codes promotionnels renvoient désormais un VerificationResult à la fin de l’opération ; en cas de succès il contient une Transaction, en cas d’échec votre app reçoit une erreur qui en décrit la cause.)2 Dans l’interface, presentOfferCodeRedeemSheet(in:) est obsolète en 27.0 avec « Use presentOfferCodeRedeemSheet(from:options:) instead. », et le remplacement est presentOfferCodeRedeemSheet(from viewController: UIViewController, options: Set<RedeemOption> = []) async throws -> VerificationResult<Transaction>, disponible à partir d’iOS 27.0.4 Le code qui présentait la feuille puis écoutait Transaction.updates pour obtenir le résultat peut désormais l’attendre avec await.
Core AI en arrière-plan. « The system now restricts background access to the Neural Engine, similar to GPU usage restrictions » (le système restreint désormais l’accès au Neural Engine en arrière-plan, comme il le fait pour le GPU), et « Neural Engine memory usage is now attributed to your app process instead of the system, and appears in the Allocations instrument » (la mémoire du Neural Engine est désormais attribuée au processus de votre app et non au système, et apparaît dans l’instrument Allocations). L’accès en arrière-plan « requires the new entitlement : “com.apple.developer.background-tasks.continued-processing.inference” » (exige ce nouvel entitlement).2 Une app qui lançait de l’inférence depuis une tâche d’arrière-plan sous 26 sans jamais rien demander trouve le Neural Engine fermé tant qu’elle ne détient pas l’entitlement, et la mémoire Neural Engine qu’elle consomme apparaît désormais sous son propre processus dans Allocations.
Background Assets. « You can reduce your app’s storage usage with localized asset packs. The system delivers the appropriately localized asset packs based on the user’s preferred languages. » (Vous pouvez réduire l’espace occupé par votre app grâce aux packs de ressources localisés ; le système livre les packs adaptés aux langues préférées de l’utilisateur.)2 Pour une app qui quitte On Demand Resources, les packs localisés sont la fonctionnalité qui remplace les tags par langue.
Alertes critiques. Les notes listent le comportement des alertes critiques comme corrigé : « Critical alerts are automatically turned on for any apps that request your permission to enable notifications. » (Les alertes critiques sont activées automatiquement pour toute app qui demande l’autorisation d’envoyer des notifications.)2 L’entrée n’en dit pas plus, retestez donc tout flux de notification qui semblait surprivilégié pendant les bêtas.
Menus, @State, TLS et la nouvelle slice. Quatre entrées ont leur propre billet. La barre de menus et les menus contextuels sur iPadOS 27 et macOS 27 « present a reduced set of menu item images » (affichent un jeu réduit d’images d’éléments de menu), avec preferredImageVisibility sur UIMenuElement pour forcer l’affichage : voir images de menu. La réécriture de la macro @State est une entrée SwiftUI de ces notes, et elle change ce qui compile sous Xcode 27 : voir le billet sur Xcode 27 pour la reproduction et le billet sur la macro @State pour l’audit. L’exigence TLS plus stricte pour le trafic MDM, d’enrôlement et de mise à jour logicielle commence « in 27.0 operating systems » (dans les systèmes 27.0) : voir l’audit TLS. Et arm64e.x1 avec CPA2 sur « iPhone models with A20 Pro or later chips, Mac computers with M6 or later chips, and Apple Watch models with S11 or later chips » (les iPhone à puce A20 Pro ou ultérieure, les Mac à puce M6 ou ultérieure et les Apple Watch à puce S11 ou ultérieure) : voir arm64e.x1.2
Plus petites, mais un grep s’impose. System gagne des versions Swift de stat, lstat, fstat et fstatat avec un type Stat et FilePath.stat(), et les notes listent comme corrigé un conflit entre ces méthodes et un stat() non qualifié dans vos propres extensions. NSTextTable « and its related objects and types are available to UIKit clients starting with OS 27 releases » (et ses objets et types associés sont disponibles pour les clients UIKit à partir des versions OS 27). AsyncImage « now automatically caches downloaded images using HTTP caching protocols » (met désormais automatiquement en cache les images téléchargées selon les protocoles de cache HTTP), avec des initialiseurs URLRequest et View.asyncImageURLSession(_:) pour le piloter. « When linked on iOS 27, tvOS 27, macCatalyst 27, or visionOS 27 SDKs » (en liaison avec ces SDK 27), UIScene.extendStateRestoration et UIScene.completeStateRestoration prolongent la restauration d’état jusqu’à la transition de l’arrière-plan vers le premier plan. Et SwiftData liste un correctif pour « a deadlock for @Query when saving a ModelContext on a background actor while scheduling new async tasks for a ModelActor » (un interblocage de @Query lors de l’enregistrement d’un ModelContext sur un acteur d’arrière-plan pendant la planification de nouvelles tâches asynchrones pour un ModelActor).2
Problèmes connus à anticiper
- Les entités
photos.assetne compilent plus. « Existing entities that conformed to @AppEntity(schema : .photos.asset) in prior releases might no longer compile in the 27 SDKs because new properties were added to the schema in this release. » (Les entités existantes conformes à @AppEntity(schema : .photos.asset) dans les versions précédentes peuvent ne plus compiler avec les SDK 27, car de nouvelles propriétés ont été ajoutées au schéma.) Contournement : « To continue conforming to the schema, adopt the additional properties and move the code behind an availability check. » (Pour rester conforme au schéma, adoptez les propriétés supplémentaires et placez le code derrière une vérification de disponibilité.)2 La macro ne vous dira pas lesquelles : une conformité@AppEntity(schema: .photos.asset)vide compile proprement sousswiftc, et son expansion n’ajoute qu’une conformitéAssistantSchemaEntityqui porte le nom du schéma. La liste vient de l’étape de métadonnées App Intents de Xcode,appintentsmetadataprocessor, qui fait échouer le build avec une erreur par propriété manquante. Lancé à la main sur cette conformité vide contre le SDK 27.0, il en rapporte 12, chacune avec un fix-it :hasSuggestedEdits: Bool,isFavorite: Bool,isHidden: Bool,creationDate: Date?,location: GeoToolbox.PlaceDescriptor?,assetType: <#PhotoAssetType#>?,filter: <#PhotoFilterEffectType#>?,exposure: Double?,saturation: Double?,warmth: Double?,aperture: Double?etisPortraitModeEnabled: Bool?; les deux marqueurs<#…#>représentent des énumérations que vous déclarez vous-même contre les schémas d’énumération.photos.assetTypeet.photos.filterType, que l’interface nommePhotoAssetTypeetPhotoFilterEffectType. Je n’ai pas pu comparer cette liste au SDK 26, car le seul Xcode de ce Mac est 27A266a.4 - Les jetons Now Playing partent en production. «
RemoteMediaSessionandRemoteMediaSessionRepresentablealways provision Now Playing start and update push tokens for theproductionAPNs environment, even if theaps-environmentconfiguration is set todevelopment. » (Ces deux types provisionnent toujours les jetons push de démarrage et de mise à jour Now Playing pour l’environnement APNsproduction, même siaps-environmentvautdevelopment.) Contournement : « Use theproductionenvironment for testing and validation. » (Utilisez l’environnementproductionpour les tests et la validation.)2 La classe se trouve dans le nouveau frameworkNowPlaying, marqué indisponible sur macOS et visionOS.4 SpotlightSearchTooldéborde du modèle embarqué. Sans configuration, « the tool’s description and parameter schema alone exceed the on-device model’s context window before any prompt is added » (la description de l’outil et son schéma de paramètres dépassent à eux seuls la fenêtre de contexte du modèle embarqué avant même l’ajout d’un prompt). Contournement : un guide ciblé, «.focused(.communications),.focused(.calendar),.focused(.documents),.focused(.visualMedia), or.focused(.audio)».2 L’API existe bien :SpotlightSearchTool.Guide.focused(_ domain: ContentDomain = .items)côtoie.completeet.dynamic(_:)dans l’interface_CoreSpotlight_FoundationModels.4 Mon billet sur l’IA embarquée couvre l’outil ; ses étapes d’adoption de juin associaient la configuration par défaut au modèle système, et elles portent désormais une correction datée.- Traces de performance depuis le centre de contrôle. « Gathering
PowerProfilerandLookbacktraces through thePerformance TraceControl Center widget might fail to produce traces. » (La capture de tracesPowerProfileretLookbackvia le widgetPerformance Tracedu centre de contrôle peut ne produire aucune trace.) Le contournement proposé par Apple est « Gather traces on iOS 27.0 beta 1 or earlier » (capturer les traces sur iOS 27.0 bêta 1 ou antérieur), ce qui n’est pas un contournement que la plupart des équipes peuvent appliquer sur un appareil déjà mis à jour.2 - Tests StoreKit. « Changing the storefront or locale using
SKTestSessiondoesn’t propagate throughStorefront.updates» (changer de storefront ou de locale viaSKTestSessionne se propage pas parStorefront.updates), et « Failed purchases usingSKTestSessionmight display error dialogs even whendialogsDisabledis set to true » (les achats échoués viaSKTestSessionpeuvent afficher des boîtes de dialogue d’erreur même avecdialogsDisabledà true).2 - Raccourcis et
UnionValue. Un paramètre avec « two number-related types (for example, both Int and Double) » (deux types numériques, par exemple Int et Double à la fois) affiche l’option nombre deux fois ; le contournement d’Apple est de n’en déclarer qu’un.2
Ce que je ferais cette semaine
- Archiver une fois depuis Xcode 27 et passer l’app au crible de la liste des changements liés au SDK 27 ci-dessus avant TestFlight : clés d’écran de lancement, cycle de vie par scènes, tout
TabViewdont la sélection peut nommer un onglet masqué, et tout sheet qui héritait de modificateurs de contrôle.2 - Compiler le code MetricKit contre le SDK GA avant de livrer ; un binaire qui référence encore
ScrollHitchTimeMetricou l’ancien type deratioest un plantage au lancement selon la description d’Apple, et l’interface n’exporte plus le nom.24 - Lancer un grep sur
canOpenURL,NSBundleResourceRequest,originalFilename,FileDocument,deleteEvents,asObjCRenderStateetbarMinimizeBehavior; les trois premiers n’avertissent qu’avec une cible de déploiement 27.0,FileDocumentest doux, et les trois derniers ne compilent pas, donc le grep est l’avis.4 - Si vous lisez HealthKit, appeler
earliestAuthorizedSampleDate(for:)après l’autorisation et borner la date de début de chaque requête par type ; puis décider ce que signifient une série ou une ligne de base sur une fenêtre choisie par l’utilisateur.5 - Consigner le numéro de build dans les rapports de bug depuis trois endroits :
ProcessInfosur l’appareil, leSystemVersion.plistdu SDK sur la machine de build, etsimctl list runtimespour les reproductions en simulateur. Ils diffèrent, et un correctif présent dans 24A437 peut manquer dans 24A434.4 - Si vous construisez des URL à partir de chaînes avec
NSURL(string:), continuer à tester sur iOS 26 : c’est l’OS qui corrige le double encodage%25, pas votre recompilation, et un même binaire Xcode 27 le produit sur le runtime 26.5 et pas sur 27.0.4
Questions fréquentes
Quand iOS 27.0 est-il sorti, et quel est son build ?
Le lundi 14 septembre 2026, sous le build 24A437, le même build qu’Apple avait publié comme release candidate le vendredi 11 septembre. iPadOS 27.0 partage le numéro.1
Quel build d’iOS 27.0 se trouve dans le SDK de Xcode 27 ?
Le SDK iPhoneOS 27.0 inclus dans Xcode 27 (27A266a) rapporte un ProductBuildVersion 24A430, et le runtime du simulateur iOS 27.0 rapporte 24A434. Aucun des deux n’est le build appareil.4
Qu’est-ce qui est obsolète dans iOS 27 ?
Les notes listent 11 entrées : canOpenURL:, On Demand Resources et NSBundleResourceRequest, PHAssetResource.originalFilename, les API MetricKit d’origine, ScrollHitchTimeMetric, FileDocument, le schéma calendar.deleteEvents, __PKStrokeRenderState, l’obligation du cycle de vie par scènes d’UIKit, AirPort Utility et une note de langue sur Weather Highlights. Trois portent dans le SDK une version de dépréciation dure 27.0 et n’avertissent qu’avec une cible de déploiement 27.0, deux sont douces, deux sont des renommages, une est un retrait, et trois ne sont pas des changements d’API.24
Mon app doit-elle être recompilée pour iOS 27 ?
Pas pour continuer à fonctionner, et les entrées se répartissent en trois groupes. Conditionnées au SDK : les 12 catégories liées au SDK 27 ci-dessus, qui ne changent rien tant que vous ne compilez pas avec le SDK 27.0. Au niveau de l’OS, pour tout binaire sur un appareil 27.0 : la restriction d’arrière-plan du Neural Engine et son entitlement, le flux d’autorisation d’historique limité de HealthKit, l’application du TLS pour le trafic MDM et de mise à jour, le changement des images de menu sur iPadOS 27, le correctif des alertes critiques et le correctif d’encodage de NSURL. Binaires bêta : le code MetricKit compilé contre un SDK bêta, qu’Apple demande de recompiler avec le SDK GA pour éviter les plantages. Le SDK minimal exigé par Apple pour l’App Store est le SDK 26 depuis le 28 avril 2026 ; l’exigence du SDK 27 est une échéance ultérieure que ces notes ne fixent pas.23
Où sont les notes de version d’iOS 27 ?
Sur le site de documentation développeur d’Apple, sous iOS & iPadOS Release Notes, une page pour 27.0, organisée par section avec New Features, Resolved Issues, Known Issues et Deprecations sous chacune. Les comptes de ce billet viennent de cette page telle que récupérée le 15 septembre 2026.2
Le correctif NSURL est-il dans le SDK ou dans l’OS ?
Dans l’OS. Un seul binaire simulateur, compilé avec Xcode 27 contre le SDK 27.0 avec un iOS minimal de 26.0, double-encode sur un runtime iOS 26.5 et pas sur le runtime iOS 27.0, et le build Mac sur macOS 26.6.2 double-encode aussi ; rien n’a changé entre les deux exécutions en simulateur, sinon le système d’exploitation.4
Sources
-
Apple, Releases, flux RSS récupéré le 15 septembre 2026 : « iOS 27.0 (24A437) », « iPadOS 27.0 (24A437) », « macOS 27.0 (26A428) », « Xcode 27 (27A266a) », « tvOS 27.0 (24J361) », « visionOS 27.0 (24M362) » et « watchOS 27.0 (24R364) » datés du Mon, 14 Sep 2026 ; « iOS 27.0 RC (24A437) » daté du Fri, 11 Sep 2026 ; « iOS 27.0 beta (24A5355q) » daté du Mon, 08 Jun 2026. ↩↩↩↩↩
-
Apple, iOS & iPadOS 27 Release Notes, récupérées le 15 septembre 2026 après la sortie GA. Les comptes (93 sections ; 65 New Features, 197 Resolved Issues, 23 Known Issues, 11 Deprecations) sont les éléments de liste sous les titres de chaque section. Entrées citées, par radar : paragraphe Overview ; UIKit, New Features (écran de lancement 168247372, view controllers présentés 170005251, barre de portée 173860616, écrans externes 177015874, restauration d’état 161843040, images de menu et
preferredImageVisibility170479084,navigationBarMinimization177953926), Resolved Issues (accesseurs de barre d’état 162044221, redimensionnement 166422120, 178555304, 178558224, 178558897, 178559386, 178560235, 178561952, 178562971, 178573319), Deprecations (cycle de vie par scènes 141837548,canOpenURL:179874781) ; SwiftUI, New Features (TabView164516837,Textsélectionnable 79770704,TextRenderersurTextsélectionnable 158160386,.sceneAccessory175548901,AsyncImage78212597,@State105893279, images de menu 170480710,TextInputBorderShape173362083,toolbarMinimizationBehavior177954148), Resolved Issues (sheets et popovers 167448274,containerRelativeFrame165913417,scrollPositionaprès un toucher sur la barre d’état 111501113, FB12477370), New Features (LabeledContentdansMenu175594929), Deprecations (FileDocument178776840) ; MetricKit, New Features (HitchTimeRatio180024784) et Deprecations (174892111, 180455992) ; Foundation, New Features (volumeAvailableCapacityKey75545872) et Resolved Issues (NSURL161588649, FB20439045) ; App Intents, Known Issues (photos.asset181800016, FB23652582) et Deprecations (calendar.deleteEvent176751155) ; On Demand Resources, Deprecations (170066290) ; PhotoKit, Deprecations (175412725, FB22589474) ; PencilKit, Deprecations (176410709) ; AirPort Utility, Deprecations (158364073) ; Weather Highlights, Deprecations (164408676) ; HealthKit, New Features (172310874) ; StoreKit, New Features (141012819) ; Core AI, New Features (174796039, 179282606) ; Background Assets, New Features (163944365) ; Notifications, Resolved Issues (179179362) ; Network Security, New Features (176055825) ; Hardware Security, New Features (152103975) ; System, New Features (160612181) et Resolved Issues (177911316) ; TextKit, New Features (159870239) ; SwiftData, Resolved Issues (178113288) ; Now Playing, Known Issues (186036238) ; Core Spotlight, Known Issues (183770678) ; Control Center, Known Issues (184729556) ; StoreKit Testing in Xcode, Known Issues (184155259, 184255116) ; Shortcuts, Known Issues (168315587). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, App Store Connect release notes, récupérées le 15 septembre 2026. L’entrée du 14 septembre 2026 est citée intégralement dans le tableau ; l’entrée du 9 septembre 2026 consigne les envois compilés avec les SDK RC. Le minimum SDK 26 en vigueur depuis le 28 avril 2026 vient de la page Upcoming requirements d’Apple. ↩↩↩↩
-
Reproduction de l’auteur sur Xcode 27.0 (27A266a) avec
DEVELOPER_DIRpointé dessus, macOS 26.6.2 (25G83), 15 septembre 2026. Builds :iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plistcontientProductBuildVersion24A430 etProductVersion27.0 ;xcrun simctl list runtimesaffiche « iOS 27.0 (27.0 - 24A434) ». En-têtes et interfaces, tous sousiPhoneOS.sdk/System/Library/Frameworks:UIKit.framework/Headers/UIApplication.hligne 98 (canOpenURL:) ;Foundation.framework/Headers/NSBundle.hlignes 721 à 796 (NSBundleResourceRequest) ;Photos.framework/Headers/PHAssetResource.hlignes 29 et 33 ;MetricKit.framework/Headers/MXMetricManager.hligne 32 ;MetricKit.framework/Modules/MetricKit.swiftmodule/arm64e-apple-ios.swiftinterface, zéro correspondance pourScrollHitchTimeMetricouscrollHitchTime, quatre pourHitchTimeRatio;SwiftUI.framework/Modules/SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterfacelignes 23088 à 23093 (FileDocument), 9334 à 9338 (ReferenceFileDocument), 1728 à 1731 (Document), 9489 (message de.roundedBorder), 13763 (toolbarMinimizationBehavior) ; zéro correspondance en identifiant entier pourbarMinimizeBehavior,barMinimizationSafeAreaAdjustmentoutoolbarMinimizeBehaviordansUIKit.framework/Headers,UIKit.framework/ModulesetSwiftUI.framework/Modules(les seules correspondances partielles sont le modificateurtoolbarMinimizationSafeAreaAdjustmentet son typeToolbarMinimizationSafeAreaAdjustment), tandis queUINavigationItem.hdéclarenavigationBarMinimization;AppIntents.framework/Modules/AppIntents.swiftmodule/arm64e-apple-ios.swiftinterface, zéro correspondance pourdeleteEvents,deleteEvent: some AppIntents::AppSchemaIntentà la ligne 12608 ;PencilKit.framework/Headers/PKStrokeRenderState.hlignes 15 à 17, etPencilKit.framework/Modules/PencilKit.swiftmodule/arm64e-apple-ios.swiftinterfaceavec zéro correspondance pourasObjC,convenience public init(_ swiftValue: PencilKit::PKStroke.PencilKit::RenderState)surPKStrokeRenderStateReferenceà la ligne 46, et l’inversepublic init(_ objcValue: PencilKit::PKStrokeRenderStateReference)dansPKStroke.RenderStateà la ligne 38 ;StoreKit.framework/Modules/StoreKit.swiftmodule/arm64e-apple-ios.swiftinterfacelignes 311 à 322 ;HealthKit.framework/Modules/HealthKit.swiftmodule/arm64e-apple-ios.swiftinterfacelignes 741 et 742 (earliestAuthorizedSampleDate(for:),@available(iOS 27.0, watchOS 27.0, macCatalyst 27.0, macOS 27.0, visionOS 27.0, *)) ;NowPlaying.framework/Modules/NowPlaying.swiftmodule/arm64e-apple-ios.swiftinterfacelignes 180 à 182 et 276 à 278 ;_CoreSpotlight_FoundationModels.framework/Modules/_CoreSpotlight_FoundationModels.swiftmodule/arm64e-apple-ios.swiftinterfacelignes 64 à 78 et 100 à 129. Sondephotos.asset: un fichier Swift de 15 lignes important AppIntents et CoreLocation, qui déclare@AppEntity(schema: .photos.asset) struct ProbeAssetavec uneEntityQuery, unid, unedisplayRepresentationet aucune propriété de schéma ;swiftc -c -target arm64-apple-ios27.0-simulatorl’a compilé avec le code de sortie 0 et sans diagnostic, et-Xfrontend -dump-macro-expansionsa montré la macro ajoutant, sous un attribut@available(iOS 27.0, macOS 27.0, tvOS 27.0, watchOS 27.0, visionOS 27.0, *),extension ProbeAsset: AssistantSchemaEntity { static let __appSchemaEntity = "photos.asset" }et une extensionAppEntityvide. Relancer la ligneswift-frontenddu pilote (capturée avecswiftc -###) avec-emit-const-values-pathet-const-gather-protocols-filepointé vers une liste de 18 protocoles que j’ai écrite (AppIntent,AppEntity,AppEnum,AssistantSchemaEntity,EntityQueryet les autres protocoles App Intents) a produit un fichier.swiftconstvalues, etappintentsmetadataprocessor --module-name ProbeMod --sdk-root <iPhoneSimulator27.0.sdk> --xcode-version 27A266a --platform-family iOS --deployment-target 27.0 --target-triple arm64-apple-ios27.0-simulatorsur ce fichier s’est terminé avec le code 255, « At least one halting error was produced during export » et 12 lignes de la forme « error : Missing required property ‘exposure’ from AppSchemaEntity ‘photos.asset’ », chacune suivie d’un fix-it tel que « var exposure : Double ? » (les fix-its d’assetTypeet defilterportent les marqueurs<#PhotoAssetType#>?et<#PhotoFilterEffectType#>?;AppIntents.framework/Modules/AppIntents.swiftmodule/arm64e-apple-ios.swiftinterfacedéclare ces noms aux lignes 11695 et 11705 commeAppSchema.Enum("PhotoAssetType")sousassetTypeetAppSchema.Enum("PhotoFilterEffectType")sousfilterType) ; l’invocation reflète l’étape de métadonnées de Xcode mais n’est pas octet pour octet celle du système de build, dont la liste de protocoles vient deSWIFT_EMIT_CONST_VALUE_PROTOCOLS. Sonde des avertissements de dépréciation : un fichier Swift de 11 lignes important UIKit, Foundation et Photos, qui appellecanOpenURL(_:), construitNSBundleResourceRequest(tags:)et litPHAssetResource.originalFilename, compilé avecswiftc -ccontre le SDK iPhoneSimulator 27.0 à-target arm64-apple-ios17.0-simulator,ios26.0etios27.0: zéro diagnostic à 17.0 et 26.0, trois avertissements[#DeprecatedDeclaration]à 27.0, cités dans le texte. SondeNSURL: un fichier Swift de 16 lignes qui afficheNSURL(string:)?.absoluteStringpour les trois entrées du tableau, compilé avecswiftc -Opour l’hôte et, une fois, avecswiftc -O -target arm64-apple-ios26.0-simulatorcontre le SDK iPhoneSimulator 27.0 (otool -lsur le résultat montreLC_BUILD_VERSIONavecminos 26.0etsdk 27.0) ; j’ai exécuté ce seul binaire simulateur avecxcrun simctl spawnsur un simulateur démarré sous le runtime iOS 26.5 (23F77), puis sur un simulateur iPhone 18 Pro démarré sous le runtime iOS 27.0 (24A434) ; les sorties macOS et iOS 26.5 étaient identiques, et toutes les sorties sont celles du tableau. Sonde de capacité :URL(fileURLWithPath: NSHomeDirectory()).resourceValues(forKeys: [.volumeAvailableCapacityKey, .volumeTotalCapacityKey, .volumeAvailableCapacityForImportantUsageKey])plusstatfs; l’exécution en simulateur a affichévolumeAvailableCapacity = 226009026560,f_bavail = 55177985,f_bsize = 4096; l’exécution sur l’hôte a affichévolumeAvailableCapacity = 226009079808,f_bavail = 55177998. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, documentation HealthKit, earliestAuthorizedSampleDate(for:) et Authorizing access to health data, récupérées le 15 septembre 2026. La page de la méthode indique la disponibilité iOS 27.0, iPadOS 27.0, Mac Catalyst 27.0, macOS 27.0, visionOS 27.0 et watchOS 27.0 et est la source de la phrase sur la date de fin et de « Your app can’t distinguish between denied and full access ; limited authorization is the only state your app can identify, by design. » ; le guide est la source de « people can choose to grant your app access to only a limited window of recent data rather than their full history », de la phrase sur le second écran et de « Time-bound authorization applies only to sample types. » ↩↩↩↩↩
-
Apple, MXMetricManager, référence de classe MetricKit, récupérée le 15 septembre 2026 via le JSON de documentation d’Apple : la disponibilité indique iOS 13.0, iPadOS 13.0, Mac Catalyst 13.1, macOS 12.0 et visionOS 1.0 avec
deprecatedAt27.0 sur chacun, et le résumé de dépréciation se lit « Use MetricManager instead. » ↩