[iOS] 4. Trabajar con ATT (App Tracking Transparency / iOS)

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 purposes

y operar

independently

. Recomendamos comprobar que 

no SDK whatsoever

 se está cargando 

before

 Nuestro cuadro de diálogo de Términos y condiciones 

and before

nuestro SDK. Basándose en las elecciones realizadas por el usuario en 

both

el 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 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 NSUserTrackingUsageDescription a 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.


Referencias

We do our best to keep this purely informative documentation up to date. However, if you notice that any of these guides need a little touch-up, let us know!