DEV Community

Devin
Devin

Posted on Originally published at hhfa008.github.io

iOS 27.2's expanded ATT prompt is mandatory in five EU countries — what actually changes for your app

If your app is distributed in France, Germany, Italy, Poland, or Romania, the App Tracking Transparency prompt your users see is changing — and the old one is no longer an option. Starting with iOS 27.2 and iPadOS 27.2, Apple requires the alternative expanded ATT prompt in those five countries; elsewhere in the EU it is optional, and outside the EU it has no effect.

That is the entire scope. Everything else here is what Apple published, what it did not publish, or a check you can run.

What Apple actually published

Apple's developer news post, dated September 16, 2026, states the rule in one sentence:

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. […] Due to legal requirements, only the alternative version of the system prompt is available for apps distributed in Germany, France, Italy, Poland, and Romania.

The iOS & iPadOS 27.2 RC release notes say the same thing in API language:

AppTrackingTransparency (ATT) 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.

One line in the news post is easy to skip: "The requirements for when you must seek permission to track users will remain the same." This is a change to presentation and timing, not to what counts as tracking.

One method, three regional behaviours

The new call is requestTrackingAuthorization(preferExpandedInterface:additionalInformationAction:completionHandler:). Apple keys the behaviour to two conditions at once: device location and the country or region on the signed-in Apple Account:

Device and Apple Account region What the system shows
France, Germany, Italy, Poland, or Romania The full-page Markdown sheet, regardless of what you pass for preferExpandedInterface
Elsewhere in the EU The full-page sheet only if preferExpandedInterface is true; otherwise the existing system alert
Outside the EU Neither parameter has any effect; the old prompt behaviour applies

Both conditions matter. The API page says the feature "requires the device to be located in a specific European Union country and signed in with an Apple Account with a specific EU country or region." Apple's news post frames the mandate by where the app is distributed; the API page frames runtime behaviour by device and account. Treat all three as separate gates.

What the new API adds

  • A Markdown purpose string. The existing NSUserTrackingUsageDescription still has to be present. The expanded sheet reads NSUserTrackingMarkdownUsageDescription, which Apple documents as supporting bold, italics, bulleted lists, and paragraphs.
  • An optional Additional Information button. You pass a closure through additionalInformationAction; pass nil and the button does not appear.
  • A dismissal path that is not an answer. Tapping Additional Information closes the sheet without recording a choice. Your closure runs, and the completion handler still receives .notDetermined. Apple's documentation tells you to request authorization again in that case.
  • Annual re-prompting in the EU. After a user answers, the system will not ask again for a year; once the year is up, you can ask again whether the previous answer was allow or deny, unless the user has turned off the Tracking setting.
  • The same four statuses. Authorized, denied, restricted, and not determined are unchanged. What changes is when "not determined" can mean "the user opened the sheet and closed it."

The prompt is also skipped entirely in the documented edge cases: tracking is restricted, the global setting is off, another request is already in flight, the call comes from an app extension, or the app is not active. Those paths return immediately.

Three things the documentation does not say

Most posts quietly invent requirements here. The two Apple pages reviewed do not answer these questions:

1. What the UI must contain. The news post says "modified formatting and language"; the API page says full-page sheet with an optional button. Neither page states a character limit, a required layout, a button order, a button count, or whether a skip control is allowed. If your designer asks for the exact spec, the accurate answer is that Apple has not published one. Screenshots in blog posts are examples, not requirements.

2. Whether the attribution chain changes. I read both pages for mentions of SKAdNetwork and AdAttributionKit. There are none. The release note does not say attribution changes, and it does not say it stays the same. Do not rewrite your attribution integration because of this note. If an SDK initialisation reads ATT status, the only change justified by the published text is handling the new "viewed but unanswered" path.

3. Whether App Review will reject the old call in the five countries. Apple's pages do not say that continuing to call the old method causes a rejection. They also do not say the system silently substitutes the expanded sheet when you call the old method. Both outcomes are unknown. Ship the new call and verify it on a real device; do not treat review behaviour as a compliance strategy.

Everything above is limited to Apple's September 16 post and the 27.2 RC notes. If a number or rule is not in those pages, do not rely on it yet.

An 8-item checklist

  1. Inventory your markets. List the storefronts where the app is actually distributed. If none of the five is in scope, the mandate does not apply; the yearly re-prompt still matters for EU users once you adopt the new API.
  2. Check whether you use ATT at all. Search the project for ATTrackingManager. If the app never requests tracking authorization, this migration is not yours; do not add ATT just because the release note exists.
  3. Update Info.plist deliberately. Keep NSUserTrackingUsageDescription. Add NSUserTrackingMarkdownUsageDescription only if you want the Markdown sheet, and localize it for German, French, Italian, Polish, and Romanian.
  4. Pick the selector from autocomplete, not from a blog. The release notes' Resolved Issues entry spells the Objective-C selector requestTrackingAuthorizationPreferringExpandedInterface:…, while the Swift documentation page names the parameter preferExpandedInterface. Let Xcode resolve it in your SDK version.
  5. Exercise the Additional Information path. Tap it, confirm the sheet closes, confirm completion receives .notDetermined, and confirm a second request actually presents the prompt again. Build the intermediate screen and a retry entry point before shipping.
  6. Fix the state machine. Treat .notDetermined as "no answer yet," not "denied." Stop caching the first result forever, and re-read the status on foreground or after the yearly window.
  7. Run the regional test matrix. Five-country device plus matching account; another EU country with preferExpandedInterface both true and false; outside the EU; tracking restricted; global setting off; a request already in flight; an app extension; and the app in the background.
  8. Align measurement before changing code. Ask your MMP or attribution SDK vendor whether it treats .notDetermined as terminal or assumes a one-time ATT result. Align event timing with the new retry path. Do not change SKAdNetwork or AdAttributionKit configuration based on this note; Apple's pages announce no change there.

What I would ship this week

The developer-side change Apple has actually documented comes down to three moves: call the new method, add the localized Markdown key, and make .notDetermined retryable. That is enough to be correct in the five countries and optional everywhere else in the EU.

The rest — final copy, layout, review outcomes, and attribution effects — is either a product decision or not yet published. Treat anything more specific than that as unconfirmed until Apple updates the documentation.

More iOS release breakdowns and shipping checklists: https://hhfa008.github.io/personal/cases.html

Top comments (0)