El aviso de seguimiento de la UE en iOS 27.2: qué publicar
A partir de iOS 27.2 y iPadOS 27.2, una app en la Unión Europea puede mostrar un aviso alternativo de App Tracking Transparency, y una app distribuida en Francia, Alemania, Italia, Polonia o Rumanía recibe solo esa versión, tanto desde la llamada nueva como desde la antigua. El SDK de la beta 27.2 suma un método, requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:), disponible en iOS 27.2 y no disponible en macOS, tvOS, watchOS ni visionOS, y una clave opcional del Info.plist, NSUserTrackingMarkdownUsageDescription. Fuera de la UE la llamada nueva se comporta igual que la antigua, la regla sobre cuándo tienes que pedir permiso no cambia y a los usuarios de la UE se les puede volver a preguntar un año después de su última respuesta. Los pasos para publicar están más abajo. En el simulador de la beta 27.2, con la región puesta en Estados Unidos, Alemania, Países Bajos o Francia, cada llamada que pude repetir tras un arranque limpio mostró la alerta estándar, que es justo lo que Apple documenta como alternativa para un dispositivo que no está en la UE; con esta evidencia, la hoja es una prueba de dispositivo.12345
{.answer-block}
TL;DR
- El aviso de Apple, 16 de septiembre. “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.” (a partir de iOS 27.2 y iPadOS 27.2 se puede usar una versión alternativa del aviso del sistema de App Tracking Transparency en la UE; los requisitos sobre cuándo hay que pedir permiso no cambian, y por exigencia legal solo esa versión alternativa está disponible para las apps distribuidas en Alemania, Francia, Italia, Polonia y Rumanía).1
- Un método nuevo. El
ATTrackingManager.hdel SDK de la beta 27.2 declararequestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler:conAPI_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos). Su comentario en el encabezado: “This method behaves identically torequestTrackingAuthorizationWithCompletionHandler:in non-EU countries.” (fuera de la UE se comporta igual que el método antiguo).3 - La llamada antigua también muestra la hoja en los cinco países. La página de referencia de Apple para
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.” (en esos cinco países aparece una hoja a pantalla completa; en el resto, una alerta), y la hoja “displays theNSUserTrackingMarkdownUsageDescriptionstring with support for rich-text elements if you include it in your app’s target configuration in Xcode.” Lo que suma la llamada nueva es la hoja en el resto de la UE, el botón “Additional Information” y el parámetro que la pide.4 - Una clave nueva, y la antigua sigue siendo obligatoria.
NSUserTrackingMarkdownUsageDescriptiones Markdown opcional: “bold or italic style,” listas con viñetas y saltos de párrafo, “but it doesn’t support underline”; el encabezado dice que elNSUserTrackingUsageDescriptionoriginal “must be in” (tiene que estar en) el Info.plist también para la llamada nueva.34 - El botón “Additional Information” no es ni un sí ni un no. El encabezado de 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.” (al tocarlo, el aviso se cierra sin registrar ninguna decisión, se ejecuta tu acción y el completion handler recibenotDetermined). Tu código tiene que volver a preguntar después.3 - Volver a preguntar, solo en la 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,” es decir, un año después de la elección previa, haya sido aceptar o rechazar, salvo que la persona haya desactivado “Allow Apps to Request to Track,” que en la UE pasa a llamarse “Allow Apps to Request to Link Your Activity Across Companies.”2
- Lo que muestra el simulador. En un simulador de iPhone 18 Pro sobre el runtime de la beta de iOS 27.2, con la región puesta en Estados Unidos, Alemania, Países Bajos o Francia, la llamada nueva con
preferExpandedInterface: truepresentó la alerta estándar con la descripción de uso original y sin botón “Additional Information”; lo mismo confalse, con una acción nula y con la llamada antigua, y el completion handler se quedó esperando un toque con el estado ennotDetermined. Hay una manera de obtener unnotDeterminedinmediato que sí se reproduce a voluntad y queda documentada más abajo: un aviso todavía pendiente de un lanzamiento anterior. Dos lanzamientos con Francia el 20 de septiembre también devolvieron de inmediato, sin ninguna causa que yo pudiera registrar, y esas mismas configuraciones sí mostraron el aviso en arranques limpios posteriores.5
Lo que cambió, en palabras de Apple
Apple ha publicado el cambio en prosa tres veces. La primera fue el aviso del 16 de septiembre, que además da el motivo: “As part of agreements with select European competition authorities, Apple is introducing changes to its App Tracking Transparency framework in the European Union.” (los cambios llegan como parte de acuerdos con determinadas autoridades europeas de competencia). El resto del aviso da la regla y los cinco países.1 La página de políticas de la App Store añade la forma del aviso: “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 Y las notas de la versión de la beta de iOS y iPadOS 27.2, bajo App Tracking Transparency, New Features, lo resumen en una línea: 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.” (ahora admite un aviso ampliado alternativo y la repetición anual de la pregunta para usuarios de la UE, y ese aviso alternativo es obligatorio en Francia, Alemania, Italia, Polonia y Rumanía).6
La página de políticas también dice qué no se mueve: la obligación de preguntar antes de rastrear y tu responsabilidad sobre todo lo que haya detrás del botón. “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
La API en el SDK 27.2
Xcode 27.2 beta (27B5019j) trae el SDK de iOS 27.2 como build 24B5084k, y el encabezado de su AppTrackingTransparency.framework suma un método de clase junto al que ya llamas: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 eso es ATTrackingManager.requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:), y la página de referencia de Apple lo marca como iOS 27.2, iPadOS 27.2 y Mac Catalyst 27.2, todo en beta. El comentario del encabezado es la descripción más completa de los dos parámetros que Apple ha publicado, y cuatro de sus frases deciden cómo escribes la llamada.34
- “Pass
YEStopreferExpandedInterfaceto request the alternative prompt where permitted; passNOto request the original prompt.” Y sobre el parámetro: “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.” (en esos cinco países solo existe la versión ampliada, pases lo que pases). - “If you pass
niltoadditionalInformationAction, this button will not be shown.” (si pasasnil, el botón no aparece). - “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.” (el aviso se cierra sin registrar ninguna decisión y el completion handler recibenotDetermined). - “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.” (en las regiones elegibles se puede volver a preguntar de forma periódica; si la persona no es elegible y ya existe una decisión previa, el completion handler la devuelve sin mostrar nada).
La página de referencia dibuja la tabla regional que el encabezado solo insinúa. En Francia, Alemania, Italia, Polonia y Rumanía: “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.” En el resto de la Unión Europea: “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.” En todos los demás sitios: “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 página añade la condición de ese comportamiento regional: el dispositivo tiene que estar “located in a specific European Union country and signed in with an Apple Account with a specific EU country or region.” (ubicado en un país concreto de la Unión Europea y con sesión iniciada en una Apple Account de un país o región de la UE).4
La página de la llamada antigua, requestTrackingAuthorization(completionHandler:), dice ahora que los cinco países también reciben la hoja desde ella: “In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet; otherwise, the system prompts the person with an alert.” y, bajo las propiedades del target, “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.” Esa página no da ninguna versión para la hoja y lista el método en iOS 14 sin marca de beta, así que el piso de 27.2 sale de la nota de la versión y no de la página. Leídas juntas, la llamada nueva te compra la hoja en el resto de la UE, el botón y voz sobre el parámetro; en los cinco países la hoja llega de cualquier manera.46
Las dos claves del Info.plist
NSUserTrackingUsageDescription no desaparece. La nota “Important” del encabezado sobre el método nuevo repite el requisito antiguo palabra por palabra: la clave “must be in” (tiene que estar en) la Information Property List, y la página de referencia de la clave nueva dice que el sistema recurre a ella “if your app’s target properties omit this key.” (si las propiedades del target omiten la clave nueva).34
NSUserTrackingMarkdownUsageDescription es lo que se añade, marcado como iOS 27.2 y iPadOS 27.2 beta. La página de 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.” (el formato es Markdown, con negrita o cursiva, listas con viñetas y saltos de párrafo, pero sin subrayado). Es regional igual que el aviso: se usa en los cinco países siempre que esté presente, tanto desde la llamada antigua como desde la nueva; se usa en el resto de la UE cuando pasas preferExpandedInterface: true; y se ignora fuera de la UE. Las dos páginas de Apple redactan el caso intermedio de forma distinta: la del método dice que el sistema muestra el Markdown “if you supply it” (si lo proporcionas) y la de la clave añade la condición de pasar true. La página de la clave es la lectura más estricta y la que sigue el diagrama de arriba. El consejo de Apple en esa página es el mismo que da en la página de la clave de seguimiento original: “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
La repetición anual del aviso
La página de políticas fija la regla para la 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 El encabezado describe el mecanismo desde el lado de la app, dos veces. Sobre el método antiguo: “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.” Sobre el nuevo: un usuario no elegible con una decisión previa recibe esa decisión de vuelta desde el completion handler “without showing the prompt,” así que hacer una segunda llamada es seguro y quien decide si aparece un aviso es el sistema, no tu código.3 Lo que no da ninguno de los dos documentos es una forma de preguntar si alguien es elegible antes de llamar: la llamada es la consulta.
Lo que hace el simulador de la beta 27.2
Construí una app de sondeo de SwiftUI en un solo archivo contra el SDK de iPhoneSimulator 27.2, con las dos claves en su Info.plist: NSUserTrackingUsageDescription con el valor “Probe: the standard usage description.” y NSUserTrackingMarkdownUsageDescription con una palabra en negrita, una frase en cursiva y una lista de dos viñetas. La ejecuté en un simulador de iPhone 18 Pro sobre el runtime de la beta de iOS 27.2 (24B5084k), reiniciando el simulador antes de cada ejecución y fijando la región mediante la preferencia global AppleLocale. Seis ejecuciones el 19 de septiembre: Estados Unidos, Alemania y Países Bajos con preferExpandedInterface: true y una acción; Alemania con false; Francia con true y sin acción; Alemania con la llamada antigua.5
El 19 de septiembre todas las ejecuciones dieron lo mismo: la alerta estándar, titulada “Allow “ATTProbe” to track your activity across other companies’ apps and websites?”, con la descripción de uso original, con “Ask App Not to Track” y “Allow” y sin un tercer botón. El texto en Markdown no apareció nunca, ningún completion handler se disparó dentro de la captura de dieciséis segundos y, en las cinco ejecuciones ampliadas, trackingAuthorizationStatus marcó notDetermined en cada comprobación de tres segundos durante doce segundos; la ejecución de la llamada antigua registró su línea mode=legacy y nada después, y esperó igual.5 Eso es justo lo que la página de referencia de Apple predice para un dispositivo que no está ubicado en la UE, y el ajuste de región del simulador es una configuración regional, no una ubicación: la hoja, el texto en Markdown y el botón son una prueba de dispositivo con una Apple Account de un país de la UE.
Repetidas el 20 de septiembre, después de reiniciar la Mac, las mismas seis ejecuciones mostraron el aviso con Estados Unidos, Alemania y Países Bajos igual que antes, pero la de Francia devolvió notDetermined al completion handler en el mismo segundo que su solicitud y no mostró ninguna alerta. Otros dos lanzamientos con Francia esa mañana hicieron lo mismo y un tercero sí mostró el aviso; de los tres retornos inmediatos, solo el de las 7:23 coincide con algo que quede registrado en los archivos, un segundo script que reinstalaba la app de sondeo por debajo, y los de las 7:21 y las 7:26 no tienen ninguna causa registrada. Sin nada más tocando el simulador, otros tres lanzamientos con arranque limpio, Francia con acción, Francia sin ella y Estados Unidos, mostraron el aviso y esperaron. O sea que esas mismas configuraciones de Francia sí mostraron el aviso en arranques limpios posteriores, y no tengo ninguna regla sobre Francia que reportar, solo una advertencia: un notDetermined inmediato y sin alerta en un simulador beta es un resultado que hay que repetir en un arranque limpio antes de creérselo.5

El simulador de la beta de iOS 27.2, con la región puesta en Alemania, tras la llamada con interfaz ampliada del 19 de septiembre: la alerta estándar, la descripción original, dos botones. Esta imagen es la única exportación hecha antes del reinicio que se llevó el resto de los archivos de ese día.
El desvío que sí se reproduce a voluntad es un aviso pendiente. Lanza la app de sondeo, deja la alerta sin responder, desinstala y reinstala la app y vuelve a lanzarla: la llamada ampliada del segundo lanzamiento devolvió notDetermined al completion handler en el mismo segundo que su solicitud mientras la alerta seguía en pantalla, y un tercer lanzamiento con la llamada antigua hizo lo mismo, legacy-request status=0 (notDetermined) en menos de un segundo. Ese es el caso que describe el encabezado: “The authorization prompt doesn’t display if another permission request is pending user confirmation. Concurrent requests aren’t preserved by iOS,” (el aviso no se muestra si ya hay otra solicitud de permiso esperando confirmación, y iOS no conserva las solicitudes concurrentes), seguido de la instrucción de comprobar si trackingAuthorizationStatus vale notDetermined “to determine if you need to make an additional call,” y la página de la llamada antigua lo lista entre los casos en que el sistema ejecuta tu completion handler sin mostrar aviso: “An existing permission request is pending.”345 Un arranque limpio lo borra. Si tu app pregunta desde más de un sitio, o vuelve a preguntar de forma programada, ese notDetermined inmediato es lo que recibe quien llama en segundo lugar.
Qué publicar, paso a paso
- Conserva
NSUserTrackingUsageDescription. Sigue siendo obligatoria, y es el texto que verá todo usuario de fuera de la UE y todo usuario de la UE que no tenga la clave de Markdown.34 - Añade
NSUserTrackingMarkdownUsageDescriptioncon la misma petición en Markdown breve: negrita o cursiva, viñetas, saltos de párrafo, nada de subrayado y sin el nombre de la app.4 - Condiciona la llamada nueva a la disponibilidad y deja la antigua como alternativa: en iOS 27.2 y posteriores llama a
requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:); antes de esa versión, arequestTrackingAuthorization(completionHandler:). Pasatruepara conseguir la hoja en el resto de la UE; los cinco países ignoran el parámetro. La forma que pasa la comprobación de tipos contra el SDK 27.2 con un piso de 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
- Decide sobre el botón. Pasa una acción solo si tienes una página o una pantalla que mostrar. Cuando se ejecute la acción, trata el estado como
notDetermined, muestra tu información y, en palabras de la página de políticas, “you can redirect the user back to the App Tracking Transparency system prompt for your app to ensure their choice is recorded,” (puedes devolver a la persona al aviso del sistema para que su elección quede registrada), pero “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 - Planifica la repetición como una llamada, no como un temporizador. Volver a llamar en la UE es la forma de averiguar si ha pasado un año; el completion handler devuelve la decisión previa cuando la persona no es elegible.23
- Prueba en un dispositivo con una cuenta de una región de la UE. Siempre que el simulador mostró un aviso, en todas las regiones y en arranques limpios, fue la alerta estándar y nunca la hoja, y la condición de Apple es la ubicación del dispositivo más la región de la Apple Account, así que la hoja a pantalla completa es una prueba de dispositivo.45
- Revisa el target de Mac. El encabezado marca el método como no disponible en macOS, tvOS, watchOS y visionOS, así que un punto de llamada compartido necesita
#if os(iOS)alrededor de la llamada conif #available(iOS 27.2, *)dentro; una comprobación de disponibilidad por sí sola sigue fallando al compilar, con'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOS, como registra la nota 5. La entrada de Mac Catalyst 27.2 de la página de referencia y elAPI_UNAVAILABLE(macos)del encabezado describen la misma línea desde dos lados: para#if os(iOS), Catalyst cuenta como iOS.345
Preguntas frecuentes
¿Tengo que adoptar el aviso alternativo?
En Francia, Alemania, Italia, Polonia y Rumanía el aviso alternativo es la única versión disponible para las apps distribuidas allí, según el aviso de Apple, y en 27.2 lo obtienes desde cualquiera de las dos llamadas: la nueva muestra ahí la hoja a pantalla completa “regardless of what you set for preferExpandedInterface,” y la página de Apple de la llamada antigua dice “In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet; otherwise, the system prompts the person with an alert,” con la clave de Markdown mostrada “if you include it in your app’s target configuration in Xcode.” Adoptar la llamada nueva es lo que te da la hoja en el resto de la UE, el botón “Additional Information” y voz sobre el parámetro.1346
¿Cambia cuándo tengo que pedir permiso?
No. Apple: “The requirements for when you must seek permission to track users will remain the same.” (los requisitos sobre cuándo hay que pedir permiso siguen siendo los mismos).1
¿La clave de Markdown reemplaza a NSUserTrackingUsageDescription?
No. La clave original sigue siendo obligatoria para las dos llamadas, y el sistema la usa siempre que falte la clave de Markdown o que el dispositivo esté fuera de la UE.34
¿Puedo volver a preguntar si alguien dijo que no?
En la UE, un año después de la elección previa, “regardless of whether that choice was to accept or reject,” salvo que la persona haya desactivado el ajuste que Apple renombra en la UE como “Allow Apps to Request to Link Your Activity Across Companies.”2
¿Existe la nueva API en macOS o visionOS?
No. El encabezado del SDK 27.2 la marca con API_UNAVAILABLE(macos, tvos, watchos, visionos); la página de referencia lista iOS, iPadOS y Mac Catalyst 27.2.34
Fuentes
-
Apple, “Updates to App Tracking Transparency in the European Union”, noticias para desarrolladores, 16 de septiembre de 2026, citado. ↩↩↩↩↩
-
Apple, User privacy and data use, sección “ATT in the European Union” y la pregunta “Can I provide additional information and consent controls with my app’s ATT prompt implementation,” consultada el 19 de septiembre de 2026, citada. ↩↩↩↩↩↩↩↩
-
AppTrackingTransparency.framework/Headers/ATTrackingManager.hen el SDK de iPhoneOS 27.2 (ProductBuildVersion24B5084k,ProductVersion27.2) dentro de Xcode 27.2 beta (27B5019j), leído el 19 de septiembre de 2026: la declaración derequestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler:conAPI_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos)y su comentario de documentación, citados; el comentario del método antiguo sobre la repetición del aviso y sobre las solicitudes pendientes, citado. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:) y NSUserTrackingMarkdownUsageDescription, JSON de documentación obtenido el 19 de septiembre de 2026: disponibilidad de plataformas iOS 27.2, iPadOS 27.2 y Mac Catalyst 27.2 (el método) e iOS 27.2 y iPadOS 27.2 (la clave), todo marcado como beta; las secciones “Display a full-page sheet” y “Discussion”, citadas. Apple, requestTrackingAuthorization(completionHandler:), JSON de documentación obtenido el 21 de septiembre de 2026: disponibilidad de plataformas iOS 14.0, iPadOS 14.0, Mac Catalyst 14.0, macOS 11.0, tvOS 14.0 y visionOS 1.0, sin marca de beta; la frase de Discussion sobre los cinco países, la frase de “Configure the app’s target properties” sobre la clave de Markdown y el elemento de solicitud pendiente en la lista de casos en los que “the system doesn’t display the prompt,” citados. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Ejecuciones del autor en macOS 26.6.2 (25G83), 19 y 20 de septiembre de 2026. ATTProbe: una app de SwiftUI en un solo archivo, con el ciclo de vida de
AppyWindowGroup, compilada conxcrun swiftc -sdk <iPhoneSimulator27.2.sdk> -target arm64-apple-ios26.0-simulator -parse-as-librarybajo Xcode 27.2 beta (27B5019j), con un Info.plist que llevaNSUserTrackingUsageDescription“Probe: the standard usage description.” yNSUserTrackingMarkdownUsageDescription“Probe: Markdown description with a bullet list:” seguido de dos elementos de lista. Una versión anterior de la misma app en UIKit, sin manifiesto de escenas y compilada contra el mismo SDK, se detuvo al arrancar conEXC_BREAKPOINTantes de llegar a la solicitud; la sustituí en vez de investigarla. Dispositivo: un simulador de iPhone 18 Pro creado consimctl createsobrecom.apple.CoreSimulator.SimRuntime.iOS-27-2(24B5084k), gobernado con elsimctlde Xcode 27.2 beta; región fijada consimctl spawn <udid> defaults write "Apple Global Domain" AppleLocale -string <locale>;simctl shutdownysimctl bootantes de cada ejecución; la app lanzada consimctl launch --console-ptyy sus líneas deprintcapturadas; una captura de pantalla consimctl io <udid> screenshotsiete segundos después del lanzamiento, terminando la captura nueve segundos más tarde. Ejecuciones:en_USampliada con acción;de_DEampliada con acción;de_DEcon la llamada antiguarequestTrackingAuthorization(completionHandler:);de_DEconpreferExpandedInterface: false;nl_NLampliada con acción;fr_FRampliada con una acción nula. El 19 de septiembre, en cada ejecución el log imprimióregion=<code> status-before=0y ninguna línea de finalización dentro de la captura de dieciséis segundos; en las cinco ejecuciones ampliadas también imprimióstatus-now=0a los tres, seis, nueve y doce segundos, una comprobación que la rama de la llamada antigua de la app de sondeo no hace; cada captura de pantalla mostró la alerta estándar (esos archivos, y los de una serie anterior del 19 de septiembre que fue la primera en mostrar el comportamiento del aviso pendiente, no sobrevivieron a un reinicio de la Mac que borró el directorio temporal de la sesión, así que los resultados del 19 de septiembre quedan aquí registrados a partir de la salida de consola leída en su momento). 20 de septiembre, primera serie, el mismo script con un arranque limpio antes de cada ejecución:en_US7:16:37,de_DE7:17:42, la llamada antigua conde_DE7:18:42,de_DEconfalse7:19:33 ynl_NL7:20:26, cada una sin línea de finalización y constatus-now=0en cada comprobación donde la app de sondeo consulta, y cada captura de pantalla con la alerta estándar;fr_FRsin acción, 7:21:04, imprimióexpanded-request status=0 (notDetermined)a las 7:21:05, en el mismo segundo que su líneamode=, y su captura muestra el propio log de la app y ninguna alerta. Un segundo simulador, el dispositivo iPhone Duo, se había arrancado a las 7:13 y siguió encendido durante esta serie; nada en los archivos registra ninguna otra cosa tocando ninguno de los dos simuladores durante ella. Segunda serie, de 7:23 a 7:27, solapada en sus tres primeros lanzamientos con un primer intento de la secuencia del aviso pendiente que falló dos veces con errores del simulador:fr_FRsin acción, 7:23:57,notDeterminedinmediato;fr_FRcon acción, 7:24:09, lanzada por ese otro script, mostró el aviso sin línea de finalización;de_DEsin acción, 7:24:52, mostró el aviso;fr_FRcon acción, 7:26:03,notDeterminedinmediato;en_USsin acción, 7:27:43, mostró el aviso; un lanzamiento defr_FRa las 7:23:09 falló mientras el simulador se estaba apagando, y el log de las 7:23:57 termina a los seis segundos porque el otro script reinstaló la app de sondeo. Los listo por completitud y no les doy ningún peso. Tercera serie, una ejecución cada vez, sin nada más tocando el simulador y con un arranque limpio antes de cada una:fr_FRcon acción 7:40:06,fr_FRsin acción 7:40:45 y 7:41:22 con la cadena de configuración regionalus_US(la app de sondeo imprimióregion=US), todas mostraron el aviso, sin línea de finalización y constatus-now=0en cada comprobación. Caso del aviso pendiente, el mismo script, un solo arranque:de_DEa las 7:42:00 mostró el aviso sin línea de finalización; trassimctl uninstallysimctl installcon esa alerta sin responder, un lanzamiento a las 7:42:18 imprimióexpanded-request status=0 (notDetermined)a las 7:42:19 mientras su captura de pantalla muestra la alerta en pantalla; un tercer lanzamiento con la llamada antigua a las 7:42:40 imprimiólegacy-request status=0 (notDetermined)a las 7:42:41. El fragmento del paso 3, conshowPrivacyDetailsyhandle(_:)como funciones vacías, pasóswiftc -typecheckcontra el SDK de iPhoneSimulator 27.2 en-target arm64-apple-ios26.0-simulator; el mismo archivo sin las líneas#if os(iOS), compilado contra el SDK de macOS dentro de Xcode 27.2 beta en-target arm64-apple-macos15.0, falló conerror: 'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOS. ↩↩↩↩↩↩↩↩↩ -
Apple, iOS & iPadOS 27.2 Beta Release Notes, obtenidas a través del endpoint JSON de la documentación el 17 y el 19 de septiembre de 2026, App Tracking Transparency, New Features, citado. ↩↩↩