The EU Tracking Prompt in iOS 27.2: What to Ship
Beginning with iOS 27.2 and iPadOS 27.2, an app in the European Union can show an alternative App Tracking Transparency prompt, and an app distributed in France, Germany, Italy, Poland, or Romania gets only that version, from the new call and from the old one. The 27.2 beta SDK adds one method, requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:), available in iOS 27.2 and unavailable on macOS, tvOS, watchOS, and visionOS, and one optional Info.plist key, NSUserTrackingMarkdownUsageDescription. Outside the EU the new call behaves like the old one, the rule for when you must ask does not change, and EU users can be asked again one year after their last answer. The steps to ship are below. On the 27.2 beta simulator, with its region set to the United States, Germany, the Netherlands, or France, every call I could repeat on a fresh boot showed the standard alert, which is the fallback Apple documents for a device that is not in the EU; on this evidence the sheet is a device test.12345
TL;DR
- Apple’s notice, September 16. “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.”1
- One new method. The 27.2 beta SDK’s
ATTrackingManager.hdeclaresrequestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler:withAPI_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos). Its header comment: “This method behaves identically torequestTrackingAuthorizationWithCompletionHandler:in non-EU countries.”3 - The old call gets the sheet in the five countries too. Apple’s reference page for
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.” and the sheet “displays theNSUserTrackingMarkdownUsageDescriptionstring with support for rich-text elements if you include it in your app’s target configuration in Xcode.” What the new call adds is the sheet in the rest of the EU, the “Additional Information” button, and the flag that asks for it.4 - One new key, and the old one stays required.
NSUserTrackingMarkdownUsageDescriptionis optional Markdown, “bold or italic style,” bullet lists, and paragraph breaks, “but it doesn’t support underline”; the header says the originalNSUserTrackingUsageDescription“must be in” the Info.plist for the new call too.34 - The “Additional Information” button is not a yes or a no. Apple’s header: “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.” Your code has to ask again afterward.3 - Re-prompting, EU only. “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,” unless the person turned off “Allow Apps to Request to Track,” which the EU renames “Allow Apps to Request to Link Your Activity Across Companies.”2
- What the simulator shows. On an iPhone 18 Pro simulator on the iOS 27.2 beta runtime, with the region set to the United States, Germany, the Netherlands, or France, the new call with
preferExpandedInterface: truepresented the standard alert with the original usage description and no “Additional Information” button; so didfalse, a nil action, and the old call, and the completion waited for a tap with the status atnotDetermined. One way to get an immediatenotDeterminedinstead reproduces on demand and is documented below, a prompt still pending from an earlier launch; two France launches on September 20 also returned at once, with no cause I could record, and the same configurations prompted on later fresh boots.5
What changed, in Apple’s words
Apple has published the change in prose three times, starting with the September 16 notice, which also gives the reason: “As part of agreements with select European competition authorities, Apple is introducing changes to its App Tracking Transparency framework in the European Union.” The rest of the notice gives the rule and the five countries.1 The App Store policy page adds the shape of the prompt: “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.”2 And the iOS and iPadOS 27.2 beta release notes, under App Tracking Transparency, New Features, put it in one line: 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
The policy page also says what stays put: the requirement to ask before you track, and your responsibility for anything behind the button. “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.”2
The API in the 27.2 SDK
Xcode 27.2 beta (27B5019j) carries the iOS 27.2 SDK as build 24B5084k, and its AppTrackingTransparency.framework header adds one class method next to the one you already call: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);
In Swift that is ATTrackingManager.requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:), and Apple’s reference page marks it iOS 27.2, iPadOS 27.2, and Mac Catalyst 27.2, all beta. The header comment is the fullest description of the two parameters Apple has published, and four of its sentences decide how you write the call.34
- “Pass
YEStopreferExpandedInterfaceto request the alternative prompt where permitted; passNOto request the original prompt.” And on the parameter: “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.” - “If you pass
niltoadditionalInformationAction, this button will not be shown.” - “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.”
The reference page draws the regional table the header only implies. In France, Germany, Italy, Poland, and Romania: “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.” In the rest of the European Union: “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.” Everywhere else: “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:).” The page adds the condition for the regional behavior: the device must be “located in a specific European Union country and signed in with an Apple Account with a specific EU country or region.”4
The page for the older call, requestTrackingAuthorization(completionHandler:), now says the five countries get the sheet from it as well: “In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet; otherwise, the system prompts the person with an alert.” and, under the target properties, “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.” That page gives no version for the sheet and lists the method at iOS 14 with no beta mark, so the 27.2 floor for it comes from the release note rather than the page. Read together, the new call buys you the sheet in the rest of the EU, the button, and a say over the flag; in the five countries the sheet arrives either way.46
The two Info.plist keys
NSUserTrackingUsageDescription does not go away. The header’s “Important” note on the new method repeats the old requirement word for word: the key “must be in” the Information Property List, and the reference page for the new key says the system falls back to it “if your app’s target properties omit this key.”34
NSUserTrackingMarkdownUsageDescription is the addition, marked iOS 27.2 and iPadOS 27.2 beta. Apple’s page: “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.” It is regional in the same way as the prompt: used in the five countries whenever present, by the old call as well as the new one, used in the rest of the EU when you pass preferExpandedInterface: true, and ignored outside the EU. Apple’s two pages word the middle case differently, the method’s page saying the system displays the Markdown “if you supply it” and the key’s page adding the condition that you pass true; the key’s page is the stricter reading and the one the diagram above follows. Apple’s tip on the page is the one it gives on the original tracking key’s page: “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.”4
The yearly re-prompt
The policy page states the rule for the EU: “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 The header describes the mechanism from the app’s side, twice. On the older method: “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.” On the new one: an ineligible user with a prior decision gets that decision back from the completion handler “without showing the prompt,” so a second call is safe to make and the system, not your code, decides whether a prompt appears.3 What neither document gives is a way to ask whether a user is eligible before calling; the call is the query.
What the 27.2 beta simulator does
I built a single-file SwiftUI probe against the iPhoneSimulator 27.2 SDK with both keys in its Info.plist, NSUserTrackingUsageDescription set to “Probe: the standard usage description.” and NSUserTrackingMarkdownUsageDescription set to a bold word, an italic phrase, and a two-item bullet list, and ran it on an iPhone 18 Pro simulator on the iOS 27.2 beta runtime (24B5084k), rebooting the simulator before each run and setting the region through the global AppleLocale preference. Six runs on September 19: the United States, Germany, and the Netherlands with preferExpandedInterface: true and an action; Germany with false; France with true and no action; Germany with the older call.5
On September 19 every run produced the same thing: the standard alert, titled “Allow “ATTProbe” to track your activity across other companies’ apps and websites?”, showing the original usage description, with “Ask App Not to Track” and “Allow” and no third button. The Markdown text never appeared, no completion handler fired within the sixteen-second capture, and in the five expanded runs trackingAuthorizationStatus read notDetermined at every three-second check for twelve seconds; the older call’s run logged its mode=legacy line and nothing after it, and waited the same way.5 That is what Apple’s reference page predicts for a device that is not located in the EU, and the simulator’s region setting is a locale, not a location; the sheet, the Markdown text, and the button are a device test with an EU-region Apple Account.
Re-run on September 20 after a reboot of the Mac, the same six runs prompted for the United States, Germany, and the Netherlands as before, but the France run returned notDetermined to the completion handler in the same second as its request and showed no alert. Two more France launches that morning did the same and a third prompted; of the three immediate returns, only the 7:23 one coincided with anything the files record, a second script reinstalling the probe under it, and the 7:21 and 7:26 ones have no recorded cause. With nothing else touching the simulator, three more fresh-boot launches, France with an action, France without, and the United States, all prompted and waited. So the same France configurations prompted on later fresh boots, and I have no France rule to report, only a caution: an immediate notDetermined with no alert on a beta simulator is a result to repeat on a fresh boot before it is believed.5

The iOS 27.2 beta simulator, region set to Germany, after the expanded-interface call on September 19: the standard alert, the original description, two buttons. This image is the one export made before the reboot that took the rest of that day’s files.
The wrong turn that does reproduce on demand is a pending prompt. Launch the probe, leave the alert unanswered, uninstall and reinstall the app, and launch again: the second launch’s expanded call returned notDetermined to the completion handler in the same second as its request while the alert stayed on screen, and a third launch using the older call did the same, legacy-request status=0 (notDetermined) within a second. That is the case the header describes: “The authorization prompt doesn’t display if another permission request is pending user confirmation. Concurrent requests aren’t preserved by iOS,” followed by the instruction to check trackingAuthorizationStatus for notDetermined “to determine if you need to make an additional call,” and the older call’s page lists it among the times the system runs your completion handler without a prompt: “An existing permission request is pending.”345 A fresh boot clears it. If your app asks from more than one place, or asks again on a schedule, that immediate notDetermined is what the second caller gets.
What to ship, step by step
- Keep
NSUserTrackingUsageDescription. It stays required, and it is the text every non-EU user and every EU user without the Markdown key will see.34 - Add
NSUserTrackingMarkdownUsageDescriptionwith the same request in short Markdown: bold or italic, bullets, paragraph breaks, no underline, no app name.4 - Gate the new call on availability and keep the old call as the fallback: on iOS 27.2 and later call
requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:); earlier,requestTrackingAuthorization(completionHandler:). Passtrueto get the sheet in the rest of the EU; the five countries ignore the flag. The shape that type-checks against the 27.2 SDK for an iOS 26 floor: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
- Decide about the button. Pass an action only if you have a page or screen to show. When the action runs, treat the status as
notDetermined, show your information, and, in the policy page’s words, “you can redirect the user back to the App Tracking Transparency system prompt for your app to ensure their choice is recorded,” but “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.”23 - Plan the re-prompt as a call, not a timer. Calling again in the EU is how you find out whether a year has passed; the completion handler returns the prior decision when the person is not eligible.23
- Test on a device with an EU-region account. Whenever the simulator showed a prompt, in every region and on fresh boots, it was the standard alert and never the sheet, and Apple’s condition is device location plus Apple Account region, so the full-page sheet is a device test.45
- Check the Mac target. The header marks the method unavailable on macOS, tvOS, watchOS, and visionOS, so a shared call site needs
#if os(iOS)around the call withif #available(iOS 27.2, *)inside it; an availability check alone still fails to compile, with'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOS, as footnote 5 records. The reference page’s Mac Catalyst 27.2 entry and the header’sAPI_UNAVAILABLE(macos)describe the same line from two sides: Catalyst counts as iOS to#if os(iOS).345
FAQ
Do I have to adopt the alternative prompt?
In France, Germany, Italy, Poland, and Romania the alternative prompt is the only version available for apps distributed there, per Apple’s notice, and on 27.2 you get it from either call: the new call shows the full-page sheet there “regardless of what you set for preferExpandedInterface,” and Apple’s page for the older call says “In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet; otherwise, the system prompts the person with an alert,” with the Markdown key shown “if you include it in your app’s target configuration in Xcode.” Adopting the new call is what gets you the sheet in the rest of the EU, the “Additional Information” button, and a say over the flag.1346
Does it change when I have to ask permission?
No. Apple: “The requirements for when you must seek permission to track users will remain the same.”1
Does the Markdown key replace NSUserTrackingUsageDescription?
No. The original key is still required for both calls, and the system uses it whenever the Markdown key is absent or the device is outside the EU.34
Can I ask again after a user said no?
In the EU, one year after the previous choice, “regardless of whether that choice was to accept or reject,” unless the person disabled the setting Apple renames in the EU to “Allow Apps to Request to Link Your Activity Across Companies.”2
Does the new API exist on macOS or visionOS?
No. The 27.2 SDK header marks it API_UNAVAILABLE(macos, tvos, watchos, visionos); the reference page lists iOS, iPadOS, and Mac Catalyst 27.2.34
Sources
-
Apple, “Updates to App Tracking Transparency in the European Union”, developer news, September 16, 2026, quoted. ↩↩↩↩↩
-
Apple, User privacy and data use, section “ATT in the European Union” and the question “Can I provide additional information and consent controls with my app’s ATT prompt implementation,” fetched September 19, 2026, quoted. ↩↩↩↩↩↩↩↩
-
AppTrackingTransparency.framework/Headers/ATTrackingManager.hin the iPhoneOS 27.2 SDK (ProductBuildVersion24B5084k,ProductVersion27.2) inside Xcode 27.2 beta (27B5019j), read September 19, 2026: the declaration ofrequestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler:withAPI_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos), and its documentation comment, quoted; the older method’s comment on re-prompting and on pending requests, quoted. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:) and NSUserTrackingMarkdownUsageDescription, documentation JSON fetched September 19, 2026: platform availability iOS 27.2, iPadOS 27.2, Mac Catalyst 27.2 (the method) and iOS 27.2, iPadOS 27.2 (the key), all marked beta; the “Display a full-page sheet” and “Discussion” sections, quoted. Apple, requestTrackingAuthorization(completionHandler:), documentation JSON fetched September 21, 2026: platform availability iOS 14.0, iPadOS 14.0, Mac Catalyst 14.0, macOS 11.0, tvOS 14.0, and visionOS 1.0 with no beta mark; the Discussion sentence on the five countries, the “Configure the app’s target properties” sentence on the Markdown key, and the pending-request item in the list of cases where “the system doesn’t display the prompt,” quoted. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Author’s runs on macOS 26.6.2 (25G83), September 19 and 20, 2026. ATTProbe: a single-file SwiftUI app on the
AppandWindowGrouplife cycle, built withxcrun swiftc -sdk <iPhoneSimulator27.2.sdk> -target arm64-apple-ios26.0-simulator -parse-as-libraryunder Xcode 27.2 beta (27B5019j), with an Info.plist carryingNSUserTrackingUsageDescription“Probe: the standard usage description.” andNSUserTrackingMarkdownUsageDescription“Probe: Markdown description with a bullet list:” followed by two list items. An earlier UIKit version of the same probe with no scene manifest, built against the same SDK, trapped at launch withEXC_BREAKPOINTbefore reaching the request; I replaced it rather than investigate. Device: an iPhone 18 Pro simulator created withsimctl createoncom.apple.CoreSimulator.SimRuntime.iOS-27-2(24B5084k), driven with the Xcode 27.2 beta’ssimctl; region set withsimctl spawn <udid> defaults write "Apple Global Domain" AppleLocale -string <locale>;simctl shutdownandsimctl bootbefore each run; the app launched withsimctl launch --console-ptyand itsprintlines captured; a screenshot withsimctl io <udid> screenshotseven seconds after launch, the capture ending nine seconds later. Runs:en_USexpanded with action;de_DEexpanded with action;de_DEthe olderrequestTrackingAuthorization(completionHandler:);de_DEwithpreferExpandedInterface: false;nl_NLexpanded with action;fr_FRexpanded with a nil action. On September 19, in each run the log printedregion=<code> status-before=0and no completion line within the sixteen-second capture; in the five expanded runs it also printedstatus-now=0at three, six, nine, and twelve seconds, a check the older-call branch of the probe does not make; each screenshot showed the standard alert (those files, and the files of an earlier September 19 series that first showed the pending-prompt behavior, did not survive a reboot of the Mac that cleared the session’s temporary directory, so the September 19 results are recorded here from the console output read at the time). September 20, first series, the same script with a fresh boot before each run:en_US7:16:37,de_DE7:17:42, thede_DEolder call 7:18:42,de_DEwithfalse7:19:33, andnl_NL7:20:26, each with no completion line andstatus-now=0at every check where the probe polls, each screenshot the standard alert;fr_FRwith no action, 7:21:04, printedexpanded-request status=0 (notDetermined)at 7:21:05, in the same second as itsmode=line, and its screenshot shows the probe’s own log and no alert. A second simulator, the iPhone Duo device, had booted at 7:13 and stayed up through this series; nothing in the files records anything else touching either simulator during it. Second series, 7:23 to 7:27, overlapping for its first three launches with a first attempt at the pending-prompt sequence that failed twice with simulator errors:fr_FRwith no action, 7:23:57, immediatenotDetermined;fr_FRwith an action, 7:24:09, launched by that other script, prompted with no completion line;de_DEwith no action, 7:24:52, prompted;fr_FRwith an action, 7:26:03, immediatenotDetermined;en_USwith no action, 7:27:43, prompted; afr_FRlaunch at 7:23:09 failed while the simulator was shutting down, and the 7:23:57 log ends at six seconds because the other script reinstalled the probe. I list these for completeness and give them no weight. Third series, one run at a time with nothing else touching the simulator and a fresh boot before each:fr_FRwith an action 7:40:06,fr_FRwith no action 7:40:45, and 7:41:22 with the locale stringus_US(the probe printedregion=US), all prompted with no completion line andstatus-now=0at every check. Pending-prompt case, the same script, one boot:de_DEat 7:42:00 prompted with no completion line; aftersimctl uninstallandsimctl installwith that alert unanswered, a launch at 7:42:18 printedexpanded-request status=0 (notDetermined)at 7:42:19 while its screenshot shows the alert on screen; a third launch with the older call at 7:42:40 printedlegacy-request status=0 (notDetermined)at 7:42:41. The step 3 snippet, withshowPrivacyDetailsandhandle(_:)as stub functions, passedswiftc -typecheckagainst the iPhoneSimulator 27.2 SDK at-target arm64-apple-ios26.0-simulator; the same file with the#if os(iOS)lines removed, compiled against the macOS SDK inside Xcode 27.2 beta at-target arm64-apple-macos15.0, failed witherror: 'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOS. ↩↩↩↩↩↩↩↩↩ -
Apple, iOS & iPadOS 27.2 Beta Release Notes, fetched through the documentation JSON endpoint on September 17 and September 19, 2026, App Tracking Transparency, New Features, quoted. ↩↩↩