Trabajar con ATT (App Tracking Transparency) en iOS
ATT y la gestión del consentimiento son sistemas independientes que debes coordinar manualmente.
Esta guía explica cómo integrar correctamente el marco App Tracking Transparency (ATT) de Apple con nuestro SDK de CMP. ATT es un requisito a nivel de plataforma (Apple), mientras que CMP gestiona el consentimiento legal y normativo. Ambos deben funcionar conjuntamente para garantizar el cumplimiento normativo y el correcto funcionamiento del SDK.
El aviso de Transparencia en el seguimiento de aplicaciones de iOS (ATT) y la gestión del consentimiento en el marco del RGPD/ePrivacy
serve different purposesy operar
independently. Recomendamos comprobar que
no SDK whatsoeverse está cargando
beforeNuestro cuadro de diálogo de Términos y condiciones
and beforenuestro SDK. Basándose en las elecciones realizadas por el usuario en
bothel cuadro de diálogo ATT y nuestra capa de consentimiento, carguen o no los SDK indicados.
Para aclarar:
-
El cuadro de diálogo ATT y la capa de consentimiento (CMP) abordan diferentes bases legales y ámbitos de aplicación.
-
ATT es el mecanismo de Apple para obtener el permiso del usuario para el seguimiento entre aplicaciones (es decir, compartir identificadores como el IDFA con terceros con fines publicitarios).
-
La capa de consentimiento (CMP) regula el uso de cookies y SDK para fines como la analítica, la personalización, la medición o funciones esenciales de la aplicación, tal y como exigen el RGPD/ePrivacy y leyes similares. Como ejemplos, podemos mencionar Firebase (GFA), Crashlytics, OneSignal, MixPanel, Sentry, etc. Ninguno de ellos está relacionado directamente con ATT, pero es necesario recabar el consentimiento del usuario de todos modos.
-
Aunque un usuario seleccione «Pedir a la aplicación que no realice un seguimiento» a nivel del sistema en iOS, es posible que tu aplicación siga procesando ciertos tipos de datos (por ejemplo, cookies funcionales, SDK de medición u otras herramientas técnicas) que requieren una base legal o el consentimiento según las leyes de privacidad. Por lo tanto, la capa de consentimiento debe seguir mostrándose, para que el usuario pueda ejercer su elección con respecto a estas tecnologías. Asegúrate de que este no sea tu caso, ya que si decides evitar que se muestre la capa de consentimiento pero sigues cargando cualquier SDK que gestione datos hacia servidores desde el dispositivo, incluso con fines o proveedores diferentes, tu aplicación será bloqueada.
Paso 1: Requisitos previos
-
Versión mínima de iOS: iOS 14 (ATT no disponible en versiones anteriores)
-
Añade el AppTrackingTransparency.framework a tu proyecto
-
En tu Info.plist, añade:
<key>NSUserTrackingUsageDescription</key>
<string>This identifier will be used to deliver personalized ads and improve user experience.</string>
-
La frase debe explicar claramente por qué se solicita el seguimiento
Apple podría rechazar una redacción ambigua.
Toda la gestión de ATT debe realizarse en la propia aplicación móvil, y no a través de nuestro SDK, ya que nuestro SDK no conoce el ciclo de vida de la aplicación móvil que lo integra. La solicitud de ATT debe mostrarse y gestionarse por completo antes de nuestro SDK, y el cuadro de diálogo de ATT no debe cargarse al mismo tiempo ni sobre nuestra capa de consentimiento. Asegúrate de cargar nuestra capa de consentimiento únicamente a través de checkAndOpen() o forceOpen() después de gestionar la solicitud de ATT y de asegurarte de que la elección del usuario con respecto a ATT ya se ha actualizado en el dispositivo. No cargues nuestra capa de consentimiento antes de eso.
Paso 2: Comprueba el estado de ATT
Comprueba el estado actual de la autorización de ATT antes de inicializar los SDK de seguimiento:
import AppTrackingTransparency
import AdSupport
if #available(iOS 14, *) {
let status = ATTrackingManager.trackingAuthorizationStatus
switch status {
case .authorized:
// IDFA available
case .denied, .restricted:
// IDFA blocked
case .notDetermined:
// Prompt will be shown later
@unknown default:
break
}
}
Paso 3: Solicitar autorización de ATT
Si el estado es .notDetermined, solicita autorización cuando la aplicación esté activa:
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization { status in
DispatchQueue.main.async {
self.didReceiveATTStatus(status)
}
}
} else {
// iOS < 14: proceed to CMP directly
openCMP()
}
Paso 4: Gestionar el resultado de ATT
Define cómo procesar el resultado del ATT y, a continuación, lanza el CMP:
func didReceiveATTStatus(_ status: ATTrackingManager.AuthorizationStatus) {
switch status {
case .authorized:
openCMP()
case .denied, .restricted:
rejectAdPurposesAndVendors {
self.openCMP()
}
case .notDetermined:
openCMP()
@unknown default:
openCMP()
}
}
Paso 5: Lanzar CMP
Una vez que se haya resuelto el ATT, determina el estado del ATT en la interfaz de usuario del CMP para poder abrirla y recabar el consentimiento legal/normativo mediante un diseño específico:
private func openCMP() {
CMPManager.shared.setATTStatus = // insert here the ATT status retrieved
//from ATTManager.AuthorizationStatus
CMPManager.shared.checkAndOpen()
}
Paso 6: Tabla de decisiones — ATT × Comportamiento CMP × Acciones SDK
| Estado de ATT | IDFA | Comportamiento del CMP | Acciones del SDK |
|---|---|---|---|
.notDetermined |
No | Espera a que aparezca el mensaje de ATT y, a continuación, inicia CMP. | No inicialices los rastreadores todavía. |
.authorized |
Sí | Recopile el consentimiento granular de CMP. | Habilita la publicidad y la analítica solo si el CMP lo permite. |
.denied |
No | Trate la publicidad y la elaboración de perfiles como rechazadas. | Rechazar los fines publicitarios y los proveedores de forma programática, y luego mostrar el CMP para fines que no sean de seguimiento. |
.restricted |
No | Igual que «Denegado». | Rechazar fines publicitarios/proveedores y, a continuación, abrir el CMP. |
| iOS < 14 | N/A | Omitir ATT, utilizar solo CMP. | Bloquear hasta que se resuelva el CMP. |
Paso 7: Recetas de API compatibles con ATT
Rechaza los fines publicitarios y los proveedores cuando ATT esté denegado o restringido
func rejectAdPurposesAndVendors(completion: @escaping () -> Void) {
let adPurposeIds = ["c52", "c53"] // Example purposes
CMPManager.shared.rejectPurposes(adPurposeIds, updateVendor: true)
}
(O) Fines publicitarios previos a la concesión/proveedores cuando ATT lo autorice
func pregrantAdPurposesAndVendorsThenOpenCMP() {
let adPurposeIds = ["c52", "c53"]
CMPManager.shared.acceptPurposes(adPurposeIds, updatePurpose: true)
}
Paso 8: Vuelve a revisar en App Resume
El formato de texto se puede cambiar en Ajustes. Vuelve a comprobarlo siempre al terminar:
Paso 9: Casos extremos y soluciones alternativas
-
Restricciones: ATT no disponible (p. ej., controles parentales). Bloquear el seguimiento.
-
iOS < 14: Sin ATT → utiliza solo CMP.
-
Mensaje no disponible: hay que solicitar el ATT cuando la aplicación está activa.
-
Rechazo del usuario: Trata los fines publicitarios y los proveedores como rechazados.
Paso 10: Pruebas y depuración
-
Utiliza una instalación nueva para activar el aviso de ATT.
-
Prueba todos los casos:
.authorized,.denied,.restricted,.notDetermined. -
Activa o desactiva el seguimiento en Simulador/Dispositivo físico en Ajustes → Privacidad y seguridad → Seguimiento.
-
Registra los resultados para confirmar que el CMP se inicia solo después de que se resuelva el ATT.
Paso 11: Buenas prácticas
- Nunca inicialices los rastreadores antes de que finalice el flujo ATT + CMP.
- Utiliza las sugerencias de forma inteligente; nunca induzcas a error a los usuarios, ya que esto podría provocar que te bloqueen.
- No superpongas la interfaz de usuario de CMP con el mensaje de ATT.
- Permite a los usuarios volver a abrir el CMP en cualquier momento.
- Es probable que Apple rechace la revisión si el seguimiento se produce antes de obtener el permiso de ATT.
Paso 12: Lista de comprobación para desarrolladores
-
Añadir
AppTrackingTransparency.framework. -
Añade
NSUserTrackingUsageDescriptiona Info.plist. -
Comprueba el estado de ATT al iniciar.
-
Mostrar indicación previa (opcional).
-
Solicita ATT si
.notDetermined. -
Gestiona el resultado de la ATT (acepta o rechaza proveedores o fines según corresponda).
-
Lanza el CMP una vez que ATT haya finalizado.
-
Inicializa/bloquea los SDK solo después de que se haya resuelto el CMP.
-
Vuelve a revisar la sección «Términos y condiciones» en el resumen de la aplicación.
-
Incluye la opción de reabrir el CMP.
-
Prueba todos los flujos.