← Alle Beiträge

Der EU-Tracking-Prompt in iOS 27.2: Was Sie ausliefern müssen

Ab iOS 27.2 und iPadOS 27.2 darf eine App in der Europäischen Union einen alternativen App Tracking Transparency-Prompt zeigen, und eine App, die in Frankreich, Deutschland, Italien, Polen oder Rumänien vertrieben wird, bekommt nur noch diese Fassung, aus dem neuen Aufruf wie aus dem alten. Das 27.2-Beta-SDK ergänzt eine Methode, requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:), verfügbar ab iOS 27.2 und nicht verfügbar unter macOS, tvOS, watchOS und visionOS, sowie einen optionalen Info.plist-Schlüssel, NSUserTrackingMarkdownUsageDescription. Außerhalb der EU verhält sich der neue Aufruf wie der alte, die Regel dafür, wann Sie fragen müssen, bleibt unverändert, und Nutzer in der EU dürfen ein Jahr nach ihrer letzten Antwort erneut gefragt werden. Was dafür zu tun ist, steht weiter unten. Auf dem 27.2-Beta-Simulator mit der Region USA, Deutschland, Niederlande oder Frankreich zeigte jeder Aufruf, den ich nach einem frischen Boot wiederholen konnte, den Standard-Alert, also genau den Rückfall, den Apple für ein Gerät außerhalb der EU dokumentiert; nach dieser Beleglage ist das Sheet ein Gerätetest.12345 {.answer-block}

Das Wichtigste in Kürze

  • Apples Mitteilung vom 16. September. „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.“ (Ab 27.2 dürfen Entwickler in der EU eine alternative Fassung des ATT-System-Prompts verwenden; wann Sie um Erlaubnis fragen müssen, bleibt gleich; aus rechtlichen Gründen steht für Apps, die in Deutschland, Frankreich, Italien, Polen und Rumänien vertrieben werden, nur diese Fassung zur Verfügung.)1
  • Eine neue Methode. Die Datei ATTrackingManager.h im 27.2-Beta-SDK deklariert requestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler: mit API_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos). Der Kommentar im Header dazu: „This method behaves identically to requestTrackingAuthorizationWithCompletionHandler: in non-EU countries.“ (Außerhalb der EU verhält sich die Methode exakt wie die alte.)3
  • In den fünf Ländern liefert auch der alte Aufruf das Sheet. Apples Referenzseite zu 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.“ Und das Sheet „displays the NSUserTrackingMarkdownUsageDescription string with support for rich-text elements if you include it in your app’s target configuration in Xcode.“ (Sobald der Markdown-String in der Target-Konfiguration in Xcode steht, zeigt das Sheet ihn formatiert an.) Neu hinzu kommt durch den neuen Aufruf das Sheet im Rest der EU, der „Additional Information“-Button und das Flag, das danach fragt.4
  • Ein neuer Schlüssel, und der alte bleibt Pflicht. NSUserTrackingMarkdownUsageDescription nimmt optionales Markdown auf, „bold or italic style“, Aufzählungen und Absatzwechsel, „but it doesn’t support underline“; laut Header muss der ursprüngliche NSUserTrackingUsageDescription auch für den neuen Aufruf „must be in“ der Info.plist stehen.34
  • Der „Additional Information“-Button ist weder ein Ja noch ein Nein. Apples Header: „If the user taps the ‘Additional Information’ button, the prompt dismisses without recording an authorization decision, your additionalInformationAction runs so you can surface your own privacy information, and the completion handler receives notDetermined.“ (Der Prompt verschwindet, ohne eine Entscheidung zu speichern, Ihre Action läuft, und der Completion Handler bekommt notDetermined.) Ihr Code muss danach erneut fragen.3
  • Erneut fragen, nur in der 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“ (ein Jahr nach der letzten Wahl in Ihrer App, gleich ob sie zustimmend oder ablehnend ausfiel), sofern die Person nicht „Allow Apps to Request to Track“ abgeschaltet hat, was in der EU „Allow Apps to Request to Link Your Activity Across Companies“ heißt.2
  • Was der Simulator zeigt. Auf einem iPhone 18 Pro Simulator mit der iOS-27.2-Beta-Runtime und der Region USA, Deutschland, Niederlande oder Frankreich zeigte der neue Aufruf mit preferExpandedInterface: true den Standard-Alert mit der ursprünglichen Verwendungsbeschreibung und ohne „Additional Information“-Button; ebenso false, eine Nil-Action und der alte Aufruf, und die Completion wartete auf einen Tap, der Status blieb auf notDetermined. Ein Weg zu einem sofortigen notDetermined lässt sich dagegen jederzeit reproduzieren und ist unten beschrieben, nämlich ein Prompt, der noch aus einem früheren Start offen steht; zwei Starts mit Region Frankreich am 20. September kehrten ebenfalls sofort zurück, ohne dass ich eine Ursache festhalten konnte, und dieselben Konfigurationen zeigten bei späteren frischen Boots wieder einen Prompt.5

Was sich ändert, in Apples Worten

Apple hat die Änderung dreimal in Prosa veröffentlicht, zuerst in der Mitteilung vom 16. September, die auch den Grund nennt: „As part of agreements with select European competition authorities, Apple is introducing changes to its App Tracking Transparency framework in the European Union.“ (Im Rahmen von Vereinbarungen mit ausgewählten europäischen Wettbewerbsbehörden ändert Apple sein App Tracking Transparency-Framework in der EU.) Der Rest der Mitteilung nennt die Regel und die fünf Länder.1 Die App-Store-Richtlinienseite ergänzt die Gestalt des Prompts: „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.“ (Die alternative Fassung hat ein anderes Layout und eine andere Sprache und erlaubt Ihnen einen Textbutton, über den Sie näher erläutern, warum Sie Daten aus Ihrer App mit Daten aus Apps, Websites oder Offline-Kanälen anderer Unternehmen verknüpfen oder an einen Datenhändler weitergeben wollen.)2 Und die Release Notes zur iOS- und iPadOS-27.2-Beta bringen es unter App Tracking Transparency, New Features, in einer Zeile unter: 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

Die Richtlinienseite sagt auch, was bleibt: die Pflicht zu fragen, bevor Sie tracken, und Ihre Verantwortung für alles hinter dem 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.“ (Zusatzinformationen und feinere Einwilligungsschalter hinter dem Textbutton liegen vollständig in Ihrer Verantwortung; bis die Person im Prompt zugestimmt hat, dürfen Sie weder den Werbe-Identifier des Geräts lesen noch die beschriebenen Daten erheben oder nutzen.)2

Die API im 27.2-SDK

Xcode 27.2 Beta (27B5019j) trägt das iOS-27.2-SDK als Build 24B5084k, und der Header seines AppTrackingTransparency.framework ergänzt neben der Methode, die Sie schon aufrufen, eine weitere Klassenmethode: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 heißt das ATTrackingManager.requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:), und Apples Referenzseite führt es unter iOS 27.2, iPadOS 27.2 und Mac Catalyst 27.2, alle mit Beta-Markierung. Der Header-Kommentar ist die ausführlichste Beschreibung der beiden Parameter, die Apple veröffentlicht hat, und vier seiner Sätze entscheiden darüber, wie Sie den Aufruf schreiben.34

  • „Pass YES to preferExpandedInterface to request the alternative prompt where permitted; pass NO to request the original prompt.“ (Mit YES fordern Sie den alternativen Prompt dort an, wo er zulässig ist, mit NO den ursprünglichen.) Und zum Parameter selbst: „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 to preferExpandedInterface.“ (In den fünf Ländern gibt es aus rechtlichen Gründen nur die erweiterte Fassung, unabhängig vom übergebenen Wert.)
  • „If you pass nil to additionalInformationAction, this button will not be shown.“ (Mit nil erscheint der Button nicht.)
  • „If the user taps the ‘Additional Information’ button, the prompt dismisses without recording an authorization decision, your additionalInformationAction runs so you can surface your own privacy information, and the completion handler receives notDetermined.“
  • „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.“ (In geeigneten Regionen darf turnusmäßig erneut gefragt werden; ist jemand nicht dafür qualifiziert und liegt bereits eine Entscheidung vor, bekommt der Completion Handler diese Entscheidung ohne Prompt zurück.)

Die Referenzseite zeichnet die Regionstabelle, die der Header nur andeutet. In Frankreich, Deutschland, Italien, Polen und Rumänien: „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.“ Im Rest der Europäischen 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.“ Überall sonst: „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:).“ Dazu nennt die Seite die Bedingung für das regionale Verhalten: Das Gerät muss „located in a specific European Union country and signed in with an Apple Account with a specific EU country or region.“ (in einem bestimmten EU-Land sein und mit einem Apple Account aus einem bestimmten EU-Land oder einer bestimmten EU-Region angemeldet sein).4

Die Seite zum älteren Aufruf, requestTrackingAuthorization(completionHandler:), sagt inzwischen, dass die fünf Länder das Sheet auch von ihm bekommen: „In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet; otherwise, the system prompts the person with an alert.“ Und unter den Target-Eigenschaften: „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.“ Eine Version für das Sheet nennt diese Seite nicht, und sie führt die Methode ohne Beta-Markierung unter iOS 14, die 27.2-Untergrenze dafür stammt also aus den Release Notes und nicht von der Seite. Zusammengelesen: Der neue Aufruf verschafft Ihnen das Sheet im Rest der EU, den Button und ein Mitspracherecht beim Flag; in den fünf Ländern kommt das Sheet ohnehin.46

Was die erweiterte Tracking-Anfrage in iOS 27.2 je nach Aufenthaltsort zeigt: in Frankreich, Deutschland, Italien, Polen und Rumänien immer ein ganzseitiges Sheet mit der Markdown-Beschreibung und einem Additional Information-Button, sobald Sie eine Action übergeben; im Rest der EU Sheet und Markdown-Text nur bei preferExpandedInterface true; außerhalb der EU der Standard-Alert mit der ursprünglichen Beschreibung und beiden ignorierten Parametern

Die beiden Info.plist-Schlüssel

NSUserTrackingUsageDescription verschwindet nicht. Der Important-Hinweis des Headers zur neuen Methode wiederholt die alte Vorgabe Wort für Wort: Der Schlüssel „must be in“ der Information Property List, und die Referenzseite zum neuen Schlüssel sagt, das System falle darauf zurück, „if your app’s target properties omit this key.“34

Neu ist NSUserTrackingMarkdownUsageDescription, markiert als iOS 27.2 und iPadOS 27.2 Beta. Apples Seite: „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.“ (Der String ist Markdown, fett oder kursiv sind möglich, Unterstreichung nicht, Aufzählungen und Absatzwechsel schon.) Regional gilt für ihn dasselbe wie für den Prompt: in den fünf Ländern immer, wenn er vorhanden ist, beim alten Aufruf wie beim neuen, im Rest der EU, wenn Sie preferExpandedInterface: true übergeben, und außerhalb der EU gar nicht. Apples beide Seiten formulieren den mittleren Fall unterschiedlich, die Seite der Methode sagt, das System zeige das Markdown, „if you supply it“, die Seite des Schlüssels ergänzt die Bedingung true; die strengere Lesart ist die des Schlüssels, und ihr folgt die Grafik oben. Der Tipp auf der Seite ist derselbe wie beim ursprünglichen Tracking-Schlüssel: „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.“ (Kurz und konkret formulieren; der App-Name steht ohnehin im Prompt.)4

Der jährliche erneute Prompt

Die Richtlinienseite formuliert die Regel für die 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 Der Header beschreibt den Mechanismus aus Sicht der App, und das zweimal. Zur älteren Methode: „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.“ Zur neuen: Wer nicht qualifiziert ist und bereits entschieden hat, bekommt diese Entscheidung vom Completion Handler zurück, „without showing the prompt“, ein zweiter Aufruf ist also unbedenklich, und ob ein Prompt erscheint, entscheidet das System, nicht Ihr Code.3 Was in keinem der Dokumente steht, ist ein Weg, vor dem Aufruf zu erfragen, ob jemand qualifiziert ist; der Aufruf ist die Abfrage.

Was der 27.2-Beta-Simulator tut

Ich habe eine einzelne SwiftUI-Datei als Probe gegen das iPhoneSimulator-27.2-SDK gebaut, mit beiden Schlüsseln in der Info.plist, NSUserTrackingUsageDescription auf „Probe: the standard usage description.“ und NSUserTrackingMarkdownUsageDescription auf ein fettes Wort, eine kursive Wendung und eine zweizeilige Aufzählung, und sie auf einem iPhone 18 Pro Simulator mit der iOS-27.2-Beta-Runtime (24B5084k) laufen lassen, vor jedem Lauf den Simulator neu gebootet und die Region über die globale Einstellung AppleLocale gesetzt. Sechs Läufe am 19. September: USA, Deutschland und Niederlande mit preferExpandedInterface: true und einer Action; Deutschland mit false; Frankreich mit true und ohne Action; Deutschland mit dem älteren Aufruf.5

Am 19. September kam in jedem Lauf dasselbe heraus: der Standard-Alert mit dem Titel „Allow “ATTProbe” to track your activity across other companies’ apps and websites?“, darin die ursprüngliche Verwendungsbeschreibung, dazu „Ask App Not to Track“ und „Allow“ und kein dritter Button. Der Markdown-Text erschien nie, innerhalb der sechzehn Sekunden langen Aufzeichnung feuerte kein Completion Handler, und in den fünf erweiterten Läufen las trackingAuthorizationStatus bei jeder Prüfung im Drei-Sekunden-Takt zwölf Sekunden lang notDetermined; der Lauf mit dem älteren Aufruf protokollierte seine mode=legacy-Zeile und danach nichts mehr und wartete genauso.5 Genau das sagt Apples Referenzseite für ein Gerät voraus, das sich nicht in der EU befindet, und die Regionseinstellung des Simulators ist ein Locale, kein Ort; das Sheet, der Markdown-Text und der Button sind ein Gerätetest mit einem Apple Account aus einer EU-Region.

Am 20. September nach einem Neustart des Macs wiederholt, zeigten die Läufe für USA, Deutschland und Niederlande wie zuvor einen Prompt, der Lauf für Frankreich aber gab in derselben Sekunde wie seine Anfrage notDetermined an den Completion Handler zurück und zeigte keinen Alert. Zwei weitere Starts mit Frankreich an diesem Morgen taten dasselbe, ein dritter zeigte einen Prompt; von den drei sofortigen Rückgaben fiel nur die um 7:23 mit etwas zusammen, das die Dateien festhalten, nämlich ein zweites Skript, das die Probe darunter neu installierte, und für die um 7:21 und 7:26 ist keine Ursache festgehalten. Ohne dass sonst etwas den Simulator berührte, zeigten drei weitere Starts nach frischem Boot, Frankreich mit Action, Frankreich ohne und die USA, alle einen Prompt und warteten. Dieselben Frankreich-Konfigurationen zeigten bei späteren frischen Boots also einen Prompt, und ich habe keine Frankreich-Regel zu berichten, nur eine Warnung: Ein sofortiges notDetermined ohne Alert auf einem Beta-Simulator ist ein Ergebnis, das man nach einem frischen Boot wiederholen sollte, bevor man es glaubt.5

Der Standard-Alert der App Tracking Transparency auf einem iPhone 18 Pro Simulator mit der iOS-27.2-Beta und der Region Deutschland: Das Log der Probe zeigt region=DE und Status 0, der Alert zeigt die ursprüngliche Verwendungsbeschreibung mit Ask App Not to Track und Allow

Der 27.2-Beta-Simulator mit der Region Deutschland nach dem Aufruf mit erweiterter Oberfläche am 19. September: der Standard-Alert, die ursprüngliche Beschreibung, zwei Buttons. Dieses Bild ist der eine Export, der vor dem Neustart entstand, der die übrigen Dateien dieses Tages mitgenommen hat.

Der Irrweg, der sich jederzeit reproduzieren lässt, ist ein offener Prompt. Probe starten, den Alert unbeantwortet lassen, die App deinstallieren und neu installieren, dann erneut starten: Der erweiterte Aufruf des zweiten Starts gab in derselben Sekunde wie seine Anfrage notDetermined an den Completion Handler zurück, während der Alert auf dem Bildschirm stehen blieb, und ein dritter Start mit dem älteren Aufruf tat dasselbe, legacy-request status=0 (notDetermined) innerhalb einer Sekunde. Das ist der Fall, den der Header beschreibt: „The authorization prompt doesn’t display if another permission request is pending user confirmation. Concurrent requests aren’t preserved by iOS.“ (Steht eine andere Berechtigungsanfrage noch offen, erscheint der Prompt nicht, und gleichzeitige Anfragen bewahrt iOS nicht auf.) Danach folgt die Anweisung, trackingAuthorizationStatus auf notDetermined zu prüfen, „to determine if you need to make an additional call,“ und die Seite des älteren Aufrufs führt den Fall unter den Situationen auf, in denen das System Ihren Completion Handler ohne Prompt ausführt: „An existing permission request is pending.“345 Ein frischer Boot räumt das weg. Fragt Ihre App von mehr als einer Stelle aus oder nach einem Zeitplan erneut, dann ist dieses sofortige notDetermined genau das, was der zweite Aufrufer bekommt.

Was Sie ausliefern sollten, Schritt für Schritt

  1. Behalten Sie NSUserTrackingUsageDescription. Der Schlüssel bleibt Pflicht, und sein Text ist das, was jeder Mensch außerhalb der EU und jeder in der EU ohne den Markdown-Schlüssel zu sehen bekommt.34
  2. Ergänzen Sie NSUserTrackingMarkdownUsageDescription mit derselben Bitte in kurzem Markdown: fett oder kursiv, Aufzählungen, Absatzwechsel, keine Unterstreichung, kein App-Name.4
  3. Sichern Sie den neuen Aufruf mit einer Verfügbarkeitsprüfung ab und behalten Sie den alten als Rückfall: ab iOS 27.2 requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:), davor requestTrackingAuthorization(completionHandler:). Übergeben Sie true, um das Sheet im Rest der EU zu bekommen; die fünf Länder ignorieren das Flag. Die Form, die gegen das 27.2-SDK bei einer iOS-26-Untergrenze typprüft: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
  1. Entscheiden Sie über den Button. Übergeben Sie eine Action nur, wenn Sie eine Seite oder einen Screen zu zeigen haben. Läuft die Action, behandeln Sie den Status als notDetermined, zeigen Ihre Informationen und dürfen dann, in den Worten der Richtlinienseite, „you can redirect the user back to the App Tracking Transparency system prompt for your app to ensure their choice is recorded,“ (die Person zurück zum ATT-System-Prompt führen, damit ihre Wahl festgehalten wird), aber „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.“ (Wer auf dem gezeigten Screen alle einschlägigen Einwilligungen abgelehnt hat, gehört nicht zurück zum Prompt.)23
  2. Planen Sie den erneuten Prompt als Aufruf, nicht als Timer. In der EU erfahren Sie nur durch einen weiteren Aufruf, ob ein Jahr vergangen ist; ist die Person nicht qualifiziert, liefert der Completion Handler die frühere Entscheidung.23
  3. Testen Sie auf einem Gerät mit einem Account aus einer EU-Region. Wann immer der Simulator einen Prompt zeigte, in jeder Region und nach frischen Boots, war es der Standard-Alert und nie das Sheet, und Apples Bedingung lautet Geräteort plus Apple-Account-Region, das ganzseitige Sheet ist also ein Gerätetest.45
  4. Prüfen Sie das Mac-Target. Der Header markiert die Methode als nicht verfügbar unter macOS, tvOS, watchOS und visionOS, eine gemeinsam genutzte Aufrufstelle braucht deshalb #if os(iOS) um den Aufruf und darin if #available(iOS 27.2, *); eine Verfügbarkeitsprüfung allein lässt sich weiterhin nicht kompilieren, mit 'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOS, wie Fußnote 5 festhält. Der Eintrag Mac Catalyst 27.2 auf der Referenzseite und API_UNAVAILABLE(macos) im Header beschreiben dieselbe Linie von zwei Seiten: Für #if os(iOS) zählt Catalyst als iOS.345

Häufige Fragen

Muss ich den alternativen Prompt übernehmen?

In Frankreich, Deutschland, Italien, Polen und Rumänien ist der alternative Prompt laut Apples Mitteilung die einzige Fassung, die dort vertriebene Apps bekommen, und unter 27.2 liefern ihn beide Aufrufe: Der neue zeigt dort das ganzseitige Sheet „regardless of what you set for preferExpandedInterface“, und Apples Seite zum älteren Aufruf sagt „In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet; otherwise, the system prompts the person with an alert.“, mit dem Markdown-Schlüssel, „if you include it in your app’s target configuration in Xcode.“ Der neue Aufruf verschafft Ihnen das Sheet im Rest der EU, den „Additional Information“-Button und ein Mitspracherecht beim Flag.1346

Ändert sich dadurch, wann ich um Erlaubnis fragen muss?

Nein. Apple: „The requirements for when you must seek permission to track users will remain the same.“ (Die Vorgaben dazu bleiben unverändert.)1

Ersetzt der Markdown-Schlüssel NSUserTrackingUsageDescription?

Nein. Der ursprüngliche Schlüssel bleibt für beide Aufrufe Pflicht, und das System nutzt ihn immer dann, wenn der Markdown-Schlüssel fehlt oder das Gerät außerhalb der EU ist.34

Darf ich erneut fragen, nachdem jemand Nein gesagt hat?

In der EU ja, ein Jahr nach der letzten Wahl, „regardless of whether that choice was to accept or reject“ (gleich ob zustimmend oder ablehnend), sofern die Person nicht die Einstellung abgeschaltet hat, die Apple in der EU in „Allow Apps to Request to Link Your Activity Across Companies“ umbenennt.2

Gibt es die neue API unter macOS oder visionOS?

Nein. Der Header des 27.2-SDK markiert sie mit API_UNAVAILABLE(macos, tvos, watchos, visionos); die Referenzseite führt iOS, iPadOS und Mac Catalyst 27.2.34

Quellen


  1. Apple, Updates to App Tracking Transparency in the European Union, Developer News, 16. September 2026, zitiert. 

  2. Apple, User privacy and data use, Abschnitt „ATT in the European Union“ und die Frage „Can I provide additional information and consent controls with my app’s ATT prompt implementation“, abgerufen am 19. September 2026, zitiert. 

  3. AppTrackingTransparency.framework/Headers/ATTrackingManager.h im iPhoneOS-27.2-SDK (ProductBuildVersion 24B5084k, ProductVersion 27.2) in Xcode 27.2 Beta (27B5019j), gelesen am 19. September 2026: die Deklaration von requestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler: mit API_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos) und ihr Dokumentationskommentar, zitiert; der Kommentar der älteren Methode zum erneuten Prompt und zu offenen Anfragen, zitiert. 

  4. Apple, requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:) und NSUserTrackingMarkdownUsageDescription, Dokumentations-JSON abgerufen am 19. September 2026: Plattformverfügbarkeit iOS 27.2, iPadOS 27.2, Mac Catalyst 27.2 (Methode) sowie iOS 27.2, iPadOS 27.2 (Schlüssel), alle als Beta markiert; die Abschnitte „Display a full-page sheet“ und „Discussion“, zitiert. Apple, requestTrackingAuthorization(completionHandler:), Dokumentations-JSON abgerufen am 21. September 2026: Plattformverfügbarkeit iOS 14.0, iPadOS 14.0, Mac Catalyst 14.0, macOS 11.0, tvOS 14.0 und visionOS 1.0 ohne Beta-Markierung; der Discussion-Satz zu den fünf Ländern, der Satz zum Markdown-Schlüssel unter „Configure the app’s target properties“ und der Punkt zur offenen Anfrage in der Liste der Fälle, in denen „the system doesn’t display the prompt“, zitiert. 

  5. Läufe des Autors auf macOS 26.6.2 (25G83), 19. und 20. September 2026. ATTProbe: eine SwiftUI-App aus einer Datei auf dem Lebenszyklus App und WindowGroup, gebaut mit xcrun swiftc -sdk <iPhoneSimulator27.2.sdk> -target arm64-apple-ios26.0-simulator -parse-as-library unter Xcode 27.2 Beta (27B5019j), mit einer Info.plist, die NSUserTrackingUsageDescription „Probe: the standard usage description.“ und NSUserTrackingMarkdownUsageDescription „Probe: Markdown description with a bullet list:“ gefolgt von zwei Listenpunkten trägt. Eine frühere UIKit-Fassung derselben Probe ohne Scene-Manifest, gegen dasselbe SDK gebaut, lief beim Start in ein EXC_BREAKPOINT, bevor sie die Anfrage erreichte; ich habe sie ersetzt, statt der Sache nachzugehen. Gerät: ein iPhone 18 Pro Simulator, angelegt mit simctl create auf com.apple.CoreSimulator.SimRuntime.iOS-27-2 (24B5084k), gesteuert mit dem simctl aus Xcode 27.2 Beta; Region gesetzt mit simctl spawn <udid> defaults write "Apple Global Domain" AppleLocale -string <locale>; simctl shutdown und simctl boot vor jedem Lauf; die App gestartet mit simctl launch --console-pty und ihre print-Zeilen aufgezeichnet; ein Screenshot mit simctl io <udid> screenshot sieben Sekunden nach dem Start, das Ende der Aufzeichnung neun Sekunden später. Läufe: en_US erweitert mit Action; de_DE erweitert mit Action; de_DE der ältere requestTrackingAuthorization(completionHandler:); de_DE mit preferExpandedInterface: false; nl_NL erweitert mit Action; fr_FR erweitert mit einer Nil-Action. Am 19. September druckte das Log in jedem Lauf region=<code> status-before=0 und innerhalb der sechzehn Sekunden langen Aufzeichnung keine Completion-Zeile; in den fünf erweiterten Läufen zusätzlich status-now=0 nach drei, sechs, neun und zwölf Sekunden, eine Prüfung, die der Zweig der Probe für den älteren Aufruf nicht vornimmt; jeder Screenshot zeigte den Standard-Alert (diese Dateien und die einer früheren Serie vom 19. September, die das Verhalten bei offenem Prompt zuerst zeigte, überlebten einen Neustart des Macs nicht, der das temporäre Verzeichnis der Sitzung leerte, die Ergebnisse vom 19. September sind hier deshalb nach der damals gelesenen Konsolenausgabe festgehalten). 20. September, erste Serie, dasselbe Skript mit frischem Boot vor jedem Lauf: en_US 7:16:37, de_DE 7:17:42, der ältere Aufruf mit de_DE 7:18:42, de_DE mit false 7:19:33 und nl_NL 7:20:26, jeweils ohne Completion-Zeile und mit status-now=0 bei jeder Prüfung, die die Probe vornimmt, jeder Screenshot der Standard-Alert; fr_FR ohne Action, 7:21:04, druckte expanded-request status=0 (notDetermined) um 7:21:05, in derselben Sekunde wie seine mode=-Zeile, und sein Screenshot zeigt das Log der Probe und keinen Alert. Ein zweiter Simulator, das iPhone Duo, war um 7:13 gebootet und blieb während dieser Serie an; nichts in den Dateien hält fest, dass sonst etwas einen der beiden Simulatoren berührt hätte. Zweite Serie, 7:23 bis 7:27, in ihren ersten drei Starts überlappend mit einem ersten Versuch der Sequenz für den offenen Prompt, der zweimal an Simulatorfehlern scheiterte: fr_FR ohne Action, 7:23:57, sofort notDetermined; fr_FR mit Action, 7:24:09, von jenem anderen Skript gestartet, mit Prompt und ohne Completion-Zeile; de_DE ohne Action, 7:24:52, mit Prompt; fr_FR mit Action, 7:26:03, sofort notDetermined; en_US ohne Action, 7:27:43, mit Prompt; ein Start mit fr_FR um 7:23:09 scheiterte, während der Simulator herunterfuhr, und das Log von 7:23:57 endet nach sechs Sekunden, weil das andere Skript die Probe neu installierte. Ich führe das der Vollständigkeit halber auf und gebe ihm kein Gewicht. Dritte Serie, ein Lauf nach dem anderen, ohne dass sonst etwas den Simulator berührte, und mit frischem Boot vor jedem: fr_FR mit Action 7:40:06, fr_FR ohne Action 7:40:45 und 7:41:22 mit der Locale-Zeichenfolge us_US (die Probe druckte region=US), alle mit Prompt, ohne Completion-Zeile und mit status-now=0 bei jeder Prüfung. Fall des offenen Prompts, dasselbe Skript, ein Boot: de_DE um 7:42:00 mit Prompt und ohne Completion-Zeile; nach simctl uninstall und simctl install bei unbeantwortetem Alert druckte ein Start um 7:42:18 um 7:42:19 expanded-request status=0 (notDetermined), während sein Screenshot den Alert auf dem Bildschirm zeigt; ein dritter Start mit dem älteren Aufruf um 7:42:40 druckte um 7:42:41 legacy-request status=0 (notDetermined). Das Snippet aus Schritt 3 bestand mit showPrivacyDetails und handle(_:) als Stub-Funktionen swiftc -typecheck gegen das iPhoneSimulator-27.2-SDK mit -target arm64-apple-ios26.0-simulator; dieselbe Datei ohne die #if os(iOS)-Zeilen, gegen das macOS-SDK in Xcode 27.2 Beta mit -target arm64-apple-macos15.0 kompiliert, scheiterte mit error: 'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOS

  6. Apple, iOS & iPadOS 27.2 Beta Release Notes, über den Dokumentations-JSON-Endpunkt am 17. und 19. September 2026 abgerufen, App Tracking Transparency, New Features, zitiert. 

Verwandte Beiträge

Xcode 27.1 beta: Ihre App im iPhone Duo Simulator

Xcode 27.1 beta bringt das erste iOS-27.1-SDK und einen iPhone Duo Simulator: was im SDK steckt, was das Geräteprofil sa…

26 Min. Lesezeit

Xcode 27 ist da: Anforderungen, Deployment Targets und was kaputtging

Xcode 27 (27A266a) erschien am 14. September: macOS 26.6 und Apple Silicon Pflicht, Swift 6.4, höhere Deployment-Untergr…

41 Min. Lesezeit

John Ternus: Der Erbauer an der Apple-Spitze

John Ternus wird am 1. September 2026 CEO von Apple. Warum Tim Cooks Nachfolger eine von Erbauern geprägte Ära für Hardw…

37 Min. Lesezeit