[iOS] 4. Travailler avec ATT (App Tracking Transparency / iOS)

Utilisation de l'ATT (App Tracking Transparency) sur iOS

L'ATT et la gestion des consentements sont des systèmes distincts que vous devez coordonner manuellement. 

Ce guide explique comment intégrer correctement le cadre App Tracking Transparency (ATT) d'Apple à notre SDK CMP. L'ATT est une exigence au niveau de la plateforme (Apple), tandis que le CMP gère le consentement juridique/réglementaire. Les deux doivent fonctionner ensemble pour garantir la conformité et le bon fonctionnement du SDK.

La fenêtre contextuelle « iOS App Tracking Transparency » (ATT) et la gestion du consentement dans le cadre du RGPD/ePrivacy

serve different purposes

et fonctionner

independently

Nous vous recommandons de vérifier que 

no SDK whatsoever

 est chargée 

before

 Notre boîte de dialogue ATT 

and before

notre SDK. En fonction des choix effectués par l'utilisateur sur 

both

la boîte de dialogue ATT et notre couche de consentement, chargent ou non les SDK indiqués. 

Pour clarifier :

  • La boîte de dialogue ATT et la couche de consentement (CMP) traitent de bases juridiques et de champs d'application différents.

    • L'ATT est le mécanisme d'Apple permettant d'obtenir l'autorisation de l'utilisateur pour le suivi inter-applications (c'est-à-dire le partage d'identifiants tels que l'IDFA avec des tiers à des fins publicitaires).

    • La couche de consentement (CMP) régit l'utilisation des cookies et des SDK à des fins telles que l'analyse, la personnalisation, la mesure ou les fonctions essentielles de l'application — conformément au RGPD/ePrivacy et aux lois similaires. À titre d'exemple, on peut citer Firebase (GFA), Crashlytics, OneSignal, MixPanel, Sentry, etc. Aucun de ces services n'est directement lié à l'ATT, mais vous devez tout de même obtenir le consentement de l'utilisateur. 

Même si un utilisateur sélectionne « Demander à l'application de ne pas suivre » au niveau du système sur iOS, votre application peut toujours traiter certains types de données (par exemple, des cookies fonctionnels, des SDK de mesure ou d'autres outils techniques) qui nécessitent une base légale ou un consentement en vertu des lois sur la protection de la vie privée. Par conséquent, la couche de consentement doit toujours s’afficher, afin que l’utilisateur puisse exercer son choix concernant ces technologies. Assurez-vous que ce n’est pas votre cas, car si vous décidez de ne pas afficher la couche de consentement tout en continuant à charger un SDK qui transfère des données vers des serveurs depuis l’appareil, même à des fins différentes ou pour d’autres fournisseurs, votre application sera bloquée.

Étape 1 : Conditions préalables

  • Version iOS minimale : iOS 14 (ATT non disponible sur les versions antérieures)

  • Ajoutez le framework AppTrackingTransparency à votre projet

  • Dans votre fichier Info.plist, ajoutez :

<key>NSUserTrackingUsageDescription</key> 
<string>This identifier will be used to deliver personalized ads and improve user experience.</string>
  • La phrase doit expliquer clairement pourquoi vous demandez le suivi

Apple pourrait rejeter les formulations vagues.

Toute la gestion de l'ATT doit être effectuée au sein même de l'application mobile, et non via notre SDK, car celui-ci n'a pas connaissance du cycle de vie de l'application mobile qui l'intègre. La demande d'ATT doit être affichée et entièrement traitée avant notre SDK, et la boîte de dialogue ATT ne doit pas être chargée en même temps ou par-dessus notre couche de consentement. Assurez-vous de ne charger notre couche de consentement que via checkAndOpen() ou forceOpen() après avoir traité la demande d'ATT et vérifié que le choix de l'utilisateur concernant l'ATT a bien été mis à jour sur l'appareil. Ne chargez pas notre couche de consentement avant cela. 

Étape 2 : Vérifier le statut ATT

Vérifiez l'état actuel de l'autorisation ATT avant d'initialiser les SDK de suivi :

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
    }
}

 

Étape 3 : Demander l'autorisation ATT

Si le statut est .notDetermined, demandez l'autorisation lorsque l'application est active :

if #available(iOS 14, *) {
    ATTrackingManager.requestTrackingAuthorization { status in
        DispatchQueue.main.async {
            self.didReceiveATTStatus(status)
        }
    }
} else {
    // iOS < 14: proceed to CMP directly
    openCMP()
}

Étape 4 : Traiter les résultats ATT

Définissez la manière de traiter le résultat de l'ATT, puis lancez le CMP :

func didReceiveATTStatus(_ status: ATTrackingManager.AuthorizationStatus) {
    switch status {
    case .authorized:
        openCMP()
    case .denied, .restricted:
        rejectAdPurposesAndVendors {
            self.openCMP()
        }
    case .notDetermined:
        openCMP()
    @unknown default:
        openCMP()
    }
}

 

Étape 5 : Lancer CMP

Une fois l'ATT résolue, déterminez le statut de l'ATT afin que l'interface utilisateur CMP puisse s'ouvrir pour recueillir le consentement légal/réglementaire à l'aide d'une conception ciblée :

private func openCMP() {
    CMPManager.shared.setATTStatus =   // insert here the ATT status retrieved 
      									//from ATTManager.AuthorizationStatus
    CMPManager.shared.checkAndOpen()
}

 

Étape 6 : Tableau de décision — ATT × Comportement CMP × Actions SDK

Statut ATT IDFA Comportement CMP Actions SDK
.notDetermined Non Attendre l'invite ATT, puis lancer CMP. Ne pas encore initialiser les trackers.
.authorized Oui Recueillez le consentement CMP détaillé. N'activez la publicité et l'analyse que si le CMP l'autorise.
.denied Non Considérez la publicité et le profilage comme refusés. Refuser les finalités publicitaires et les fournisseurs de manière programmatique, puis afficher le CMP pour les finalités non liées au suivi.
.restricted Non Identique à « Refusé ». Refuser les finalités publicitaires/fournisseurs, puis ouvrir le CMP.
iOS < 14 N/A Ignorer ATT, utiliser uniquement CMP. Bloquer jusqu'à ce que le CMP soit résolu.

Étape 7 : Recettes d'API compatibles ATT

Refuser les fins publicitaires/fournisseurs lorsque l'ATT est refusé ou restreint

func rejectAdPurposesAndVendors(completion: @escaping () -> Void) {        
     let adPurposeIds = ["c52", "c53"]        // Example purposes        
     CMPManager.shared.rejectPurposes(adPurposeIds, updateVendor: true)  
}

(OU) À des fins publicitaires préalables à l'octroi/fournisseurs lorsque l'ATT est autorisé

func pregrantAdPurposesAndVendorsThenOpenCMP() {
    let adPurposeIds = ["c52", "c53"]
    CMPManager.shared.acceptPurposes(adPurposeIds, updatePurpose: true)
}

 

Étape 8 : Vérification finale sur App Resume

L'ATT peut être modifié dans les paramètres. Vérifiez toujours à nouveau dans le CV :

Étape 9 : Cas particuliers et solutions de secours

  • Restrictions : ATT indisponible (par exemple, contrôle parental). Bloquer le suivi.

  • iOS < 14 : Pas d'ATT → utiliser uniquement le CMP.

  • Invite indisponible : l'ATT doit être demandée lorsque l'application est active.

  • Refus de l'utilisateur : Traitez les objectifs publicitaires/fournisseurs comme rejetés.

Étape 10 : Test et débogage

  • Utilisez une nouvelle installation pour déclencher l'invite ATT.

  • Testez tous les cas de figure : .authorized, .denied, .restricted, .notDetermined.

  • Activez l'option ATT dans Simulateur/Appareil physique sous Paramètres → Confidentialité et sécurité → Suivi.

  • Enregistrez les sorties pour confirmer que le CMP ne se lance qu'après la résolution de l'ATT.

Étape 11 : Bonnes pratiques

  • N'initialisez jamais les trackers avant la fin du flux ATT + CMP.
  • Utilisez les suggestions de manière judicieuse ; ne trompez jamais les utilisateurs, car cela pourrait entraîner un blocage.
  • Ne superposez pas l'interface utilisateur CMP avec l'invite ATT.
  • Permettez aux utilisateurs de rouvrir le CMP à tout moment.
  • Attendez-vous à un rejet par Apple Review si le suivi a lieu avant l'obtention de l'autorisation ATT.

Étape 12 : Liste de contrôle pour les développeurs

  • Ajouter AppTrackingTransparency.framework.

  • Ajoutez NSUserTrackingUsageDescription à Info.plist.

  • Vérifiez l'état de l'ATT au démarrage.

  • Afficher éventuellement un message d'avertissement.

  • Demandez une révision si .notDetermined.

  • Traitez les résultats de l'ATT (acceptez ou refusez les fournisseurs/finalités en conséquence).

  • Lancez CMP une fois l'ATT terminé.

  • N'initialisez/ne bloquez les SDK qu'après la résolution du CMP.

  • Vérifiez à nouveau l'ATT sur le résumé de l'application.

  • Prévoir une option de réouverture du CMP.

  • Testez tous les flux.


Références

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!