L'invite de suivi UE dans iOS 27.2 : ce qu'il faut livrer
À partir d’iOS 27.2 et d’iPadOS 27.2, une app peut afficher dans l’Union européenne une autre invite App Tracking Transparency, et une app distribuée en France, en Allemagne, en Italie, en Pologne ou en Roumanie n’obtient plus que cette version-là, depuis le nouvel appel comme depuis l’ancien. Le SDK de la bêta 27.2 ajoute une méthode, requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:), disponible à partir d’iOS 27.2 et indisponible sur macOS, tvOS, watchOS et visionOS, ainsi qu’une clé Info.plist facultative, NSUserTrackingMarkdownUsageDescription. Hors de l’UE, le nouvel appel se comporte comme l’ancien, la règle qui dit quand vous devez demander ne bouge pas, et les personnes situées dans l’UE peuvent être resollicitées un an après leur dernière réponse. La marche à suivre est plus bas. Sur le simulateur de la bêta 27.2, région réglée sur les États-Unis, l’Allemagne, les Pays-Bas ou la France, chaque appel que j’ai pu répéter après un démarrage à neuf a affiché l’alerte standard, soit exactement le repli qu’Apple documente pour un appareil hors UE ; au vu de ces éléments, la feuille pleine page se teste sur un appareil.12345
{.answer-block}
L’essentiel
- L’annonce d’Apple, le 16 septembre. « Beginning with iOS 27.2 and iPadOS 27.2, developers will have the option to use an alternative version of the App Tracking Transparency system prompt in the EU. The requirements for when you must seek permission to track users will remain the same. Due to legal requirements, only the alternative version of the system prompt is available for apps distributed in Germany, France, Italy, Poland, and Romania. » (À partir de 27.2, les développeurs pourront utiliser dans l’UE une autre version de l’invite système ATT ; les cas où vous devez demander la permission de suivre ne changent pas ; pour raisons légales, les apps distribuées en Allemagne, en France, en Italie, en Pologne et en Roumanie n’ont droit qu’à cette version.)1
- Une nouvelle méthode. Le fichier
ATTrackingManager.hdu SDK de la bêta 27.2 déclarerequestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler:avecAPI_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos). Son commentaire d’en-tête : « This method behaves identically torequestTrackingAuthorizationWithCompletionHandler:in non-EU countries. » (Hors UE, la méthode se comporte exactement comme l’ancienne.)3 - Dans les cinq pays, l’ancien appel donne la feuille lui aussi. La page de référence d’Apple pour
requestTrackingAuthorization(completionHandler:): « In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet ; otherwise, the system prompts the person with an alert. » et la feuille « displays theNSUserTrackingMarkdownUsageDescriptionstring with support for rich-text elements if you include it in your app’s target configuration in Xcode. » (dès que la chaîne Markdown figure dans la configuration de la cible sous Xcode, la feuille l’affiche en texte enrichi). Ce que le nouvel appel ajoute, c’est la feuille dans le reste de l’UE, le bouton « Additional Information » et le drapeau qui la réclame.4 - Une nouvelle clé, et l’ancienne reste obligatoire.
NSUserTrackingMarkdownUsageDescriptionaccepte du Markdown facultatif, « bold or italic style », des listes à puces et des sauts de paragraphe, « but it doesn’t support underline » ; l’en-tête précise que leNSUserTrackingUsageDescriptiond’origine « must be in » l’Info.plist pour le nouvel appel également.34 - Le bouton « Additional Information » n’est ni un oui ni un non. L’en-tête d’Apple : « If the user taps the ‘Additional Information’ button, the prompt dismisses without recording an authorization decision, your
additionalInformationActionruns so you can surface your own privacy information, and the completion handler receivesnotDetermined. » (l’invite disparaît sans enregistrer de décision, votre action s’exécute, et le completion handler reçoitnotDetermined). Votre code doit redemander ensuite.3 - Resolliciter, seulement dans l’UE. « you can reprompt a user via the App Tracking Transparency system prompt one year after the user’s previous choice in your app’s App Tracking Transparency system prompt, regardless of whether that choice was to accept or reject » (un an après le choix précédent fait dans votre app, que ce choix ait été un accord ou un refus), sauf si la personne a désactivé « Allow Apps to Request to Track », que l’UE renomme « Allow Apps to Request to Link Your Activity Across Companies ».2
- Ce que montre le simulateur. Sur un simulateur iPhone 18 Pro doté du runtime de la bêta iOS 27.2, région réglée sur les États-Unis, l’Allemagne, les Pays-Bas ou la France, le nouvel appel avec
preferExpandedInterface: truea présenté l’alerte standard, la description d’usage d’origine et aucun bouton « Additional Information » ; idem avecfalse, avec une action nulle et avec l’ancien appel, et la complétion a attendu un appui, le statut restant ànotDetermined. Il existe en revanche une façon d’obtenir unnotDeterminedimmédiat qui se reproduit à volonté et que je décris plus bas, une invite restée en attente depuis un lancement antérieur ; deux lancements en France le 20 septembre sont eux aussi revenus aussitôt, sans que j’aie pu en consigner la cause, et les mêmes configurations ont affiché une invite lors de démarrages à neuf ultérieurs.5
Ce qui change, dans les mots d’Apple
Apple a publié le changement en prose à trois reprises, à commencer par l’annonce du 16 septembre, qui donne aussi la raison : « As part of agreements with select European competition authorities, Apple is introducing changes to its App Tracking Transparency framework in the European Union. » (dans le cadre d’accords avec certaines autorités européennes de la concurrence, Apple modifie son framework App Tracking Transparency dans l’Union européenne). Le reste de l’annonce donne la règle et les cinq pays.1 La page de règles de l’App Store ajoute la forme de l’invite : « The alternative version of the App Tracking Transparency system prompt has modified formatting and language and provides you the option to use a text button labeled “Additional Information.” This allows you to surface additional information about your request to link user or device data collected from your app with user or device data collected from other companies’ apps, websites, or offline properties for targeted advertising or advertising measurement purposes, or to share user or device data with a data broker. » (mise en forme et formulation modifiées, plus un bouton texte qui vous permet d’expliquer pourquoi vous voulez relier les données recueillies par votre app à celles recueillies par les apps, sites ou canaux hors ligne d’autres entreprises à des fins publicitaires, ou les transmettre à un courtier en données.)2 Quant aux notes de version de la bêta iOS et iPadOS 27.2, sous App Tracking Transparency, New Features, elles tiennent en une ligne : AppTrackingTransparency « now supports an alternative expanded prompt and re-prompting on a yearly basis for EU users. The alternative prompt is required for users in France, Germany, Italy, Poland, and Romania. »6
La page de règles dit aussi ce qui ne bouge pas : l’obligation de demander avant de suivre, et votre responsabilité sur tout ce qui se trouve derrière le bouton. « Any additional information related to your request or more granular consent controls provided via the text button are entirely your responsibility. However, you cannot access the device’s advertising identifier, or otherwise collect and use device or user data from your app as described in the App Tracking Transparency system prompt, until the user has granted your app permission in that prompt. » (les informations complémentaires et les réglages de consentement plus fins offerts par le bouton texte relèvent entièrement de vous ; tant que la personne n’a pas accordé la permission dans l’invite, vous ne pouvez ni lire l’identifiant publicitaire de l’appareil ni collecter ou utiliser les données décrites.)2
Apple a publié la bêta 2 d’iOS et d’iPadOS 27.2 (24B5089g) le 21 septembre à 10:00 PT, sans nouveau Xcode. Les notes de version de la bêta 2 portent la même ligne App Tracking Transparency sous le même numéro radar, 179504171 ; l’en-tête du SDK cité plus bas n’a pas changé, car le SDK est livré dans Xcode 27.2 bêta (27B5019j) ; et les exécutions du simulateur de cet article tournent sur le runtime de la première bêta, 24B5084k.6
L’API dans le SDK 27.2
Xcode 27.2 bêta (27B5019j) embarque le SDK iOS 27.2 sous le build 24B5084k, et l’en-tête de son AppTrackingTransparency.framework ajoute une méthode de classe à côté de celle que vous appelez déjà :3
+ (void)requestTrackingAuthorizationUsingExpandedInterface:(BOOL)preferExpandedInterface
additionalInformationAction:(nullable void(^)(void))additionalInformationAction
completionHandler:(void(^)(ATTrackingManagerAuthorizationStatus status))completion API_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos);
En Swift, cela donne ATTrackingManager.requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:), et la page de référence d’Apple la marque iOS 27.2, iPadOS 27.2 et Mac Catalyst 27.2, toutes en bêta. Le commentaire d’en-tête est la description la plus complète des deux paramètres qu’Apple ait publiée, et quatre de ses phrases décident de la façon dont vous écrivez l’appel.34
- « Pass
YEStopreferExpandedInterfaceto request the alternative prompt where permitted ; passNOto request the original prompt. » (avecYESvous demandez l’autre invite là où elle est permise, avecNOl’invite d’origine). Et sur le paramètre lui-même : « Note that in France, Germany, Italy, Poland, and Romania, due to legal requirements, only the expanded interface version of the ATT prompt will be available regardless of what is passed in topreferExpandedInterface. » (dans les cinq pays, seule la version étendue existe, quelle que soit la valeur transmise). - « If you pass
niltoadditionalInformationAction, this button will not be shown. » (avecnil, le bouton n’apparaît pas). - « If the user taps the ‘Additional Information’ button, the prompt dismisses without recording an authorization decision, your
additionalInformationActionruns so you can surface your own privacy information, and the completion handler receivesnotDetermined. » - « iOS users may be re-prompted in eligible regions on a periodic basis even after a previous authorization decision. If the user is not eligible to be re-prompted and a previous authorization decision exists, the completion handler is called with that prior decision without showing the prompt. » (dans les régions éligibles, la sollicitation peut revenir périodiquement ; si la personne n’y est pas éligible et qu’une décision existe déjà, le completion handler la reçoit sans qu’aucune invite ne s’affiche).
La page de référence dessine le tableau régional que l’en-tête se contente de suggérer. En France, en Allemagne, en Italie, en Pologne et en Roumanie : « The system displays markdown text you supply via NSUserTrackingMarkdownUsageDescription in a full-page sheet regardless of what you set for preferExpandedInterface, and includes an Additional Information button if you supply an action. » Dans le reste de l’Union européenne : « The system displays markdown text in the NSUserTrackingMarkdownUsageDescription, if you supply it. The system displays the full-page sheet if you set preferExpandedInterface to true, and includes an Additional Information button if you supply an action. » Partout ailleurs : « Outside of the European Union, the system doesn’t use either parameter, and presents a system alert displaying the original NSUserTrackingUsageDescription, which is equivalent to calling requestTrackingAuthorization(completionHandler:). » La page ajoute la condition de ce comportement régional : l’appareil doit être « located in a specific European Union country and signed in with an Apple Account with a specific EU country or region. » (situé dans un pays précis de l’UE et connecté avec un Apple Account rattaché à un pays ou une région de l’UE).4
La page de l’ancien appel, requestTrackingAuthorization(completionHandler:), indique désormais que les cinq pays obtiennent la feuille depuis lui aussi : « In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet ; otherwise, the system prompts the person with an alert. » et, sous les propriétés de la cible, « In France, Germany, Italy, Poland, and Romania, the full-page sheet displays the NSUserTrackingMarkdownUsageDescription string with support for rich-text elements if you include it in your app’s target configuration in Xcode. » Cette page ne donne aucune version pour la feuille et liste la méthode à iOS 14 sans marque bêta, le plancher 27.2 vient donc des notes de version et non de la page. Lues ensemble : le nouvel appel vous achète la feuille dans le reste de l’UE, le bouton et un droit de regard sur le drapeau ; dans les cinq pays, la feuille arrive de toute façon.46
Les deux clés Info.plist
NSUserTrackingUsageDescription ne disparaît pas. La note Important de l’en-tête sur la nouvelle méthode répète mot pour mot l’ancienne exigence : la clé « must be in » l’Information Property List, et la page de référence de la nouvelle clé précise que le système s’y replie « if your app’s target properties omit this key. »34
La nouveauté, c’est NSUserTrackingMarkdownUsageDescription, marquée iOS 27.2 et iPadOS 27.2 bêta. La page d’Apple : « The format of the string is Markdown text ; you can apply bold or italic style, but it doesn’t support underline. You can include bullet lists and paragraph breaks. » (la chaîne est du Markdown, gras ou italique possibles, souligné non, listes à puces et sauts de paragraphe oui). Elle est régionale comme l’invite : utilisée dans les cinq pays dès qu’elle existe, par l’ancien appel comme par le nouveau, utilisée dans le reste de l’UE quand vous passez preferExpandedInterface: true, et ignorée hors de l’UE. Les deux pages d’Apple formulent le cas intermédiaire différemment, celle de la méthode disant que le système affiche le Markdown « if you supply it », celle de la clé ajoutant la condition true ; la lecture de la clé est la plus stricte, et c’est elle que suit le schéma ci-dessus. Le conseil d’Apple sur cette page est celui qu’elle donne déjà pour la clé de suivi d’origine : « Keep the text of your description short and specific. The system displays your app name in the prompt so you don’t need to include it in the string. » (soyez bref et précis ; le nom de votre app figure déjà dans l’invite).4
L’invite annuelle
La page de règles énonce la règle pour l’UE : « you can reprompt a user via the App Tracking Transparency system prompt one year after the user’s previous choice in your app’s App Tracking Transparency system prompt, regardless of whether that choice was to accept or reject. A user cannot be re-prompted if they have disabled “Allow Apps to Request to Track” (renamed to “Allow Apps to Request to Link Your Activity Across Companies” in the EU) in their device’s Settings. »2 L’en-tête décrit le mécanisme côté app, et deux fois. Sur l’ancienne méthode : « In eligible regions, iOS users may be re-prompted after a year has passed since their last decision ; otherwise the system remembers the user’s choice and doesn’t prompt again unless the user uninstalls and then reinstalls the app on the device. » Sur la nouvelle : une personne non éligible dont la décision existe déjà la récupère par le completion handler « without showing the prompt », un second appel est donc sans danger, et c’est le système, pas votre code, qui décide si une invite apparaît.3 Ce qu’aucun des deux documents ne donne, c’est un moyen de savoir avant l’appel si quelqu’un est éligible ; l’appel est la requête.
Ce que fait le simulateur de la bêta 27.2
J’ai écrit une sonde SwiftUI d’un seul fichier, compilée contre le SDK iPhoneSimulator 27.2, avec les deux clés dans son Info.plist, NSUserTrackingUsageDescription réglée sur « Probe : the standard usage description. » et NSUserTrackingMarkdownUsageDescription sur un mot en gras, une locution en italique et une liste à deux puces, puis je l’ai lancée sur un simulateur iPhone 18 Pro doté du runtime de la bêta iOS 27.2 (24B5084k), en redémarrant le simulateur avant chaque exécution et en réglant la région par la préférence globale AppleLocale. Six exécutions le 19 septembre : les États-Unis, l’Allemagne et les Pays-Bas avec preferExpandedInterface: true et une action ; l’Allemagne avec false ; la France avec true et sans action ; l’Allemagne avec l’ancien appel.5
Le 19 septembre, chaque exécution a produit la même chose : l’alerte standard, intitulée « Allow “ATTProbe” to track your activity across other companies’ apps and websites ? », affichant la description d’usage d’origine, avec « Ask App Not to Track » et « Allow » et sans troisième bouton. Le texte Markdown n’est jamais apparu, aucun completion handler ne s’est déclenché pendant les seize secondes de capture, et dans les cinq exécutions étendues trackingAuthorizationStatus valait notDetermined à chacune des vérifications faites toutes les trois secondes pendant douze secondes ; l’exécution de l’ancien appel a consigné sa ligne mode=legacy et plus rien ensuite, et a attendu de la même façon.5 C’est ce que la page de référence d’Apple prévoit pour un appareil qui ne se trouve pas dans l’UE, et le réglage de région du simulateur est une locale, pas un emplacement ; la feuille, le texte Markdown et le bouton se testent sur un appareil avec un Apple Account d’une région de l’UE.
Rejouées le 20 septembre après un redémarrage du Mac, les mêmes six exécutions ont affiché l’invite pour les États-Unis, l’Allemagne et les Pays-Bas comme auparavant, mais celle pour la France a rendu notDetermined au completion handler dans la seconde même de sa requête, sans afficher d’alerte. Deux autres lancements en France ce matin-là ont fait pareil et un troisième a affiché l’invite ; des trois retours immédiats, seul celui de 7:23 coïncide avec quelque chose que les fichiers consignent, un second script réinstallant la sonde en dessous, et ceux de 7:21 et de 7:26 n’ont aucune cause consignée. Sans rien d’autre pour toucher au simulateur, trois nouveaux lancements après démarrage à neuf, la France avec action, la France sans, et les États-Unis, ont tous affiché l’invite et attendu. Les mêmes configurations françaises ont donc affiché l’invite lors de démarrages à neuf ultérieurs, et je n’ai aucune règle française à rapporter, seulement une mise en garde : sur un simulateur en bêta, un notDetermined immédiat sans alerte est un résultat à répéter après un démarrage à neuf avant d’y croire.5

Le simulateur de la bêta iOS 27.2, région réglée sur l’Allemagne, après l’appel à interface étendue du 19 septembre : l’alerte standard, la description d’origine, deux boutons. Cette image est le seul export réalisé avant le redémarrage qui a emporté le reste des fichiers de la journée.
Le faux pas qui, lui, se reproduit à volonté, c’est une invite en attente. Lancez la sonde, laissez l’alerte sans réponse, désinstallez puis réinstallez l’app, et relancez : l’appel étendu du deuxième lancement a rendu notDetermined au completion handler dans la seconde même de sa requête alors que l’alerte restait à l’écran, et un troisième lancement avec l’ancien appel a fait pareil, legacy-request status=0 (notDetermined) en moins d’une seconde. C’est le cas que décrit l’en-tête : « The authorization prompt doesn’t display if another permission request is pending user confirmation. Concurrent requests aren’t preserved by iOS. » (si une autre demande d’autorisation attend une confirmation, l’invite ne s’affiche pas, et iOS ne conserve pas les demandes concurrentes), suivi de la consigne de vérifier si trackingAuthorizationStatus vaut notDetermined « to determine if you need to make an additional call, » ; et la page de l’ancien appel range ce cas parmi ceux où le système exécute votre completion handler sans invite : « An existing permission request is pending. »345 Un démarrage à neuf efface tout cela. Si votre app demande depuis plusieurs endroits, ou redemande selon un calendrier, ce notDetermined immédiat est exactement ce que reçoit le second appelant.
Quoi livrer, étape par étape
- Gardez
NSUserTrackingUsageDescription. La clé reste obligatoire, et son texte est celui que verront toutes les personnes hors UE et toutes celles de l’UE dont l’app n’a pas la clé Markdown.34 - Ajoutez
NSUserTrackingMarkdownUsageDescriptionavec la même demande en Markdown bref : gras ou italique, puces, sauts de paragraphe, pas de souligné, pas de nom d’app.4 - Protégez le nouvel appel par un test de disponibilité et gardez l’ancien en repli : à partir d’iOS 27.2, appelez
requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:); avant,requestTrackingAuthorization(completionHandler:). Passeztruepour obtenir la feuille dans le reste de l’UE ; les cinq pays ignorent le drapeau. La forme qui passe la vérification de types contre le SDK 27.2 avec un plancher iOS 26 :345
#if os(iOS)
if #available(iOS 27.2, *) {
ATTrackingManager.requestTrackingAuthorization(usingExpandedInterface: true,
additionalInformationAction: showPrivacyDetails) { status in
handle(status)
}
} else {
ATTrackingManager.requestTrackingAuthorization { status in handle(status) }
}
#endif
- Tranchez sur le bouton. Ne passez une action que si vous avez une page ou un écran à montrer. Quand l’action s’exécute, traitez le statut comme
notDetermined, affichez vos informations, puis, dans les mots de la page de règles, « you can redirect the user back to the App Tracking Transparency system prompt for your app to ensure their choice is recorded, » (vous pouvez ramener la personne vers l’invite système ATT de votre app pour que son choix soit enregistré), mais « you should not redirect users to your ATT prompt if they have opted out of all relevant legal consent choices in the screen or page surfaced. » (ne ramenez personne vers l’invite si elle a refusé tous les consentements légaux pertinents sur l’écran présenté).23 - Prévoyez la nouvelle sollicitation comme un appel, pas comme une minuterie. Dans l’UE, rappeler la méthode est le seul moyen de savoir si un an s’est écoulé ; quand la personne n’est pas éligible, le completion handler renvoie la décision précédente.23
- Testez sur un appareil avec un compte d’une région de l’UE. Chaque fois que le simulateur a affiché une invite, dans toutes les régions et après des démarrages à neuf, c’était l’alerte standard et jamais la feuille, et la condition d’Apple associe l’emplacement de l’appareil à la région de l’Apple Account, la feuille pleine page est donc un test sur appareil.45
- Vérifiez la cible Mac. L’en-tête marque la méthode indisponible sur macOS, tvOS, watchOS et visionOS, un site d’appel partagé a donc besoin d’un
#if os(iOS)autour de l’appel, avecif #available(iOS 27.2, *)à l’intérieur ; un simple test de disponibilité ne compile toujours pas, avec'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOS, comme le consigne la note 5. L’entrée Mac Catalyst 27.2 de la page de référence et leAPI_UNAVAILABLE(macos)de l’en-tête décrivent la même ligne vue des deux côtés : pour#if os(iOS), Catalyst compte comme iOS.345
Questions fréquentes
Dois-je adopter l’invite alternative ?
En France, en Allemagne, en Italie, en Pologne et en Roumanie, l’invite alternative est la seule version disponible pour les apps qui y sont distribuées, selon l’annonce d’Apple, et sous 27.2 les deux appels vous la donnent : le nouvel appel y affiche la feuille pleine page « regardless of what you set for preferExpandedInterface », et la page d’Apple pour l’ancien appel dit « In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet ; otherwise, the system prompts the person with an alert. », avec la clé Markdown affichée « if you include it in your app’s target configuration in Xcode. » Adopter le nouvel appel, c’est obtenir la feuille dans le reste de l’UE, le bouton « Additional Information » et un droit de regard sur le drapeau.1346
Est-ce que cela change le moment où je dois demander la permission ?
Non. Apple : « The requirements for when you must seek permission to track users will remain the same. » (les cas où vous devez demander la permission ne changent pas).1
La clé Markdown remplace-t-elle NSUserTrackingUsageDescription ?
Non. La clé d’origine reste obligatoire pour les deux appels, et le système s’en sert dès que la clé Markdown est absente ou que l’appareil se trouve hors de l’UE.34
Puis-je redemander après un refus ?
Dans l’UE, oui, un an après le choix précédent, « regardless of whether that choice was to accept or reject » (que ce choix ait été un accord ou un refus), sauf si la personne a désactivé le réglage qu’Apple renomme dans l’UE « Allow Apps to Request to Link Your Activity Across Companies ».2
La nouvelle API existe-t-elle sur macOS ou visionOS ?
Non. L’en-tête du SDK 27.2 la marque API_UNAVAILABLE(macos, tvos, watchos, visionos) ; la page de référence liste iOS, iPadOS et Mac Catalyst 27.2.34
À lire aussi sur ce site : le billet sur les notes de version d’iOS 27 suit les builds de la bêta 27.2 sur lesquels tourne ce billet, le Privacy Manifest en profondeur couvre l’autre déclaration qu’Apple lit à la soumission, le billet sur la déclaration réseaux sociaux de l’App Store est l’autre changement de règles de septembre, le hub Xcode 27 donne le calendrier du SDK et de la soumission, le billet sur l’obligation des scènes UIKit est l’autre changement imposé dans ce cycle de SDK, et le billet sur la dépréciation des On Demand Resources couvre l’échéance qui le précède.
Sources
-
Apple, Updates to App Tracking Transparency in the European Union, actualités développeurs, 16 septembre 2026, cité. ↩↩↩↩↩
-
Apple, User privacy and data use, section « ATT in the European Union » et question « Can I provide additional information and consent controls with my app’s ATT prompt implementation », consulté le 19 septembre 2026, cité. ↩↩↩↩↩↩↩↩
-
AppTrackingTransparency.framework/Headers/ATTrackingManager.hdans le SDK iPhoneOS 27.2 (ProductBuildVersion24B5084k,ProductVersion27.2) de Xcode 27.2 bêta (27B5019j), lu le 19 septembre 2026 : la déclaration derequestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler:avecAPI_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos)et son commentaire de documentation, cités ; le commentaire de l’ancienne méthode sur la nouvelle sollicitation et sur les demandes en attente, cité. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:) et NSUserTrackingMarkdownUsageDescription, JSON de documentation consulté le 19 septembre 2026 : disponibilité iOS 27.2, iPadOS 27.2, Mac Catalyst 27.2 (la méthode) et iOS 27.2, iPadOS 27.2 (la clé), toutes marquées bêta ; les sections « Display a full-page sheet » et « Discussion », citées. Apple, requestTrackingAuthorization(completionHandler:), JSON de documentation consulté le 21 septembre 2026 : disponibilité iOS 14.0, iPadOS 14.0, Mac Catalyst 14.0, macOS 11.0, tvOS 14.0 et visionOS 1.0 sans marque bêta ; la phrase de la Discussion sur les cinq pays, la phrase sur la clé Markdown sous « Configure the app’s target properties » et l’entrée sur la demande en attente dans la liste des cas où « the system doesn’t display the prompt », citées. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Exécutions de l’auteur sur macOS 26.6.2 (25G83), les 19 et 20 septembre 2026. ATTProbe : une app SwiftUI d’un seul fichier sur le cycle de vie
AppetWindowGroup, compilée avecxcrun swiftc -sdk <iPhoneSimulator27.2.sdk> -target arm64-apple-ios26.0-simulator -parse-as-librarysous Xcode 27.2 bêta (27B5019j), avec un Info.plist portantNSUserTrackingUsageDescription« Probe : the standard usage description. » etNSUserTrackingMarkdownUsageDescription« Probe : Markdown description with a bullet list : » suivi de deux éléments de liste. Une version UIKit antérieure de la même sonde, sans manifeste de scène et compilée contre le même SDK, s’arrêtait au lancement surEXC_BREAKPOINTavant d’atteindre la requête ; je l’ai remplacée plutôt que d’enquêter. Appareil : un simulateur iPhone 18 Pro créé avecsimctl createsurcom.apple.CoreSimulator.SimRuntime.iOS-27-2(24B5084k), piloté par lesimctlde Xcode 27.2 bêta ; région réglée avecsimctl spawn <udid> defaults write "Apple Global Domain" AppleLocale -string <locale>;simctl shutdownpuissimctl bootavant chaque exécution ; app lancée avecsimctl launch --console-ptyet ses lignesprintcapturées ; capture d’écran avecsimctl io <udid> screenshotsept secondes après le lancement, la capture s’arrêtant neuf secondes plus tard. Exécutions :en_USétendu avec action ;de_DEétendu avec action ;de_DEl’ancienrequestTrackingAuthorization(completionHandler:);de_DEavecpreferExpandedInterface: false;nl_NLétendu avec action ;fr_FRétendu avec une action nulle. Le 19 septembre, le journal a imprimé dans chaque exécutionregion=<code> status-before=0et aucune ligne de complétion pendant les seize secondes de capture ; dans les cinq exécutions étendues il a aussi impriméstatus-now=0à trois, six, neuf et douze secondes, une vérification que la branche de la sonde dédiée à l’ancien appel ne fait pas ; chaque capture montrait l’alerte standard (ces fichiers, comme ceux d’une série antérieure du 19 septembre qui a montré la première fois le comportement de l’invite en attente, n’ont pas survécu à un redémarrage du Mac qui a vidé le répertoire temporaire de la session, les résultats du 19 septembre sont donc consignés ici d’après la sortie console lue sur le moment). 20 septembre, première série, le même script avec un démarrage à neuf avant chaque exécution :en_US7:16:37,de_DE7:17:42, l’ancien appel ende_DE7:18:42,de_DEavecfalse7:19:33 etnl_NL7:20:26, chacune sans ligne de complétion et avecstatus-now=0à chaque vérification effectuée par la sonde, chaque capture montrant l’alerte standard ;fr_FRsans action, 7:21:04, a impriméexpanded-request status=0 (notDetermined)à 7:21:05, dans la même seconde que sa lignemode=, et sa capture montre le journal de la sonde et aucune alerte. Un second simulateur, l’appareil iPhone Duo, avait démarré à 7:13 et est resté allumé pendant cette série ; rien dans les fichiers ne consigne quoi que ce soit d’autre touchant à l’un ou l’autre simulateur pendant ce temps. Deuxième série, de 7:23 à 7:27, chevauchant sur ses trois premiers lancements une première tentative de la séquence de l’invite en attente qui a échoué deux fois sur des erreurs du simulateur :fr_FRsans action, 7:23:57,notDeterminedimmédiat ;fr_FRavec action, 7:24:09, lancée par cet autre script, invite affichée et aucune ligne de complétion ;de_DEsans action, 7:24:52, invite affichée ;fr_FRavec action, 7:26:03,notDeterminedimmédiat ;en_USsans action, 7:27:43, invite affichée ; un lancementfr_FRà 7:23:09 a échoué pendant l’extinction du simulateur, et le journal de 7:23:57 s’arrête à six secondes parce que l’autre script a réinstallé la sonde. Je les énumère par souci d’exhaustivité et ne leur accorde aucun poids. Troisième série, une exécution à la fois, sans rien d’autre pour toucher au simulateur et avec un démarrage à neuf avant chacune :fr_FRavec action 7:40:06,fr_FRsans action 7:40:45, et 7:41:22 avec la chaîne de localeus_US(la sonde a impriméregion=US), toutes avec invite, sans ligne de complétion et avecstatus-now=0à chaque vérification. Cas de l’invite en attente, le même script, un seul démarrage :de_DEà 7:42:00, invite affichée et aucune ligne de complétion ; aprèssimctl uninstalletsimctl installavec cette alerte sans réponse, un lancement à 7:42:18 a impriméexpanded-request status=0 (notDetermined)à 7:42:19 alors que sa capture montre l’alerte à l’écran ; un troisième lancement avec l’ancien appel à 7:42:40 a imprimélegacy-request status=0 (notDetermined)à 7:42:41. L’extrait de l’étape 3, avecshowPrivacyDetailsethandle(_:)comme fonctions bouchons, a passéswiftc -typecheckcontre le SDK iPhoneSimulator 27.2 en-target arm64-apple-ios26.0-simulator; le même fichier privé de ses lignes#if os(iOS), compilé contre le SDK macOS de Xcode 27.2 bêta en-target arm64-apple-macos15.0, a échoué avecerror: 'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOS. ↩↩↩↩↩↩↩↩↩ -
Apple, iOS & iPadOS 27.2 Beta Release Notes, consulté via le point de terminaison JSON de la documentation les 17 et 19 septembre 2026, App Tracking Transparency, New Features, cité. Récupérées de nouveau le 21 septembre 2026, alors que la page s’intitulait « iOS & iPadOS 27.2 Beta 2 Release Notes » : la même ligne sous 179504171, avec les mêmes sections, Overview, App Tracking Transparency, Health, Shortcuts et StoreKit Testing in Xcode. Apple, Releases, flux RSS récupéré le 21 septembre 2026 : « iOS 27.2 beta 2 (24B5089g) » et « iPadOS 27.2 beta 2 (24B5089g) » datés Mon, 21 Sep 2026 10:00:00 PDT, avec macOS 27.2 beta 2 (26B5091g), tvOS 27.2 beta 2 (24K5093g), visionOS 27.2 beta 2 (24N5093f) et watchOS 27.2 beta 2 (24S5091f) à la même heure ; l’élément Xcode le plus récent reste « Xcode 27.1 beta (27A9269) » du 18 septembre. ↩↩↩↩