Infos
Menu

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

Travailler avec ATT (App Tracking Transparency) sur iOS

Ce guide explique comment intégrer correctement les fonctionnalités d'Apple Transparence du suivi des applications (ATT) Cadre avec notre SDK CMP. ATT est une exigence de plateforme (Apple), tandis que CMP gère le consentement légal/réglementaire. Les deux doivent collaborer pour garantir la conformité et le bon fonctionnement du SDK.

L'invite de transparence du suivi des applications iOS (ATT) et la gestion du consentement dans le cadre du RGPD/ePrivacy servir à des fins différentes et opérer indépendammentNous vous recommandons de vérifier que aucun SDK du tout est chargé avant notre dialogue ATT et avant notre SDK. En fonction des choix effectués par l'utilisateur sur tous les deux la boîte de dialogue ATT et notre couche de consentement, charger ou non les SDK donnés. 
Clarifier:
  • La boîte de dialogue ATT et l'adresse de la couche de consentement (CMP) différentes bases juridiques et champs d'application.

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

    • La couche de consentement (CMP) gouverne utilisation des cookies et du SDK à des fins telles que l'analyse, la personnalisation, la mesure ou les fonctions essentielles de l'application — comme l'exige le RGPD/ePrivacy et les lois similaires. À titre d’exemples, nous pouvons citer Firebase (GFA), Crashlytics, OneSignal, MixPanel, Sentry, etc. Aucun de ceux-ci n’est directement lié à ATT, mais vous devez recueillir le consentement de l'utilisateur de toute façon. 

Même si un utilisateur sélectionne « Demander à l'application de ne pas suivre » au niveau du système sur iOS, votre application peut encore 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éePar conséquent, la couche de consentement doit toujours être affichée, 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 mais de charger tout de même un SDK qui gère les données sur les serveurs de l'appareil, même avec des objectifs/fournisseurs différents, votre application sera bloquée.

Étape 1 : Prérequis

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

  • Ajoutez le Cadre de transparence du suivi des applications à votre projet

  • Dans votre Info.plist, ajouter:

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

Apple pourrait rejeter une formulation vague.

Toute la gestion ATT doit être gérée sur l'application mobile elle-même, et non via notre SDK, car notre SDK n'est pas conscient du cycle de vie de l'application mobile qui l'intègre. La demande 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 au-dessus de notre couche de consentement. Assurez-vous de charger notre couche de consentement uniquement via checkAndOpen() or forceOpen() méthodes après gérer la demande ATT et s'assurer que le choix de l'utilisateur concernant ATT a déjà été mis à jour sur l'appareil. Ne pas charger notre couche de consentement avant cette. 

É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, demander 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 : Gérer le résultat ATT

Définissez comment traiter le résultat ATT, puis lancez 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 le problème ATT résolu, déterminez le statut ATT. L'interface utilisateur CMP peut alors s'ouvrir pour recueillir le consentement légal/réglementaire. conception ciblée:

private func openCMP() {
    CMPManager.shared.settATTStatus =   // 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 du CMP Actions du SDK
.notDetermined Non Attendez l’invite ATT, puis lancez CMP. N'initialisez pas encore les trackers.
.authorized Oui Recueillez le consentement CMP granulaire. Activez les publicités/analyses uniquement si CMP le permet.
.denied Non Traitez la publicité/le profilage comme refusé. Rejetez les objectifs/fournisseurs publicitaires par programmation, puis affichez le CMP à des fins non liées au suivi.
.restricted Non Identique à Refusé. Rejetez les objectifs/fournisseurs d'annonces, puis ouvrez le CMP.
iOS < 14 N/D Ignorez ATT, utilisez uniquement CMP. Bloquer jusqu'à la résolution du CMP.

Étape 7 : Recettes d'API compatibles ATT

Rejeter les objectifs/fournisseurs publicitaires 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) Objectifs/fournisseurs publicitaires préalables à l'octroi lorsque l'ATT l'autorise

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

 

Étape 8 : revérifier la reprise de l'application

L'ATT peut être modifiée dans les Paramètres. Vérifiez-la toujours à la reprise :

Étape 9 : Cas limites et solutions de secours

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

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

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

  • Refus d'utilisateur : Traiter les objectifs/fournisseurs publicitaires comme rejetés.

Étape 10 : Test et débogage

  • Utiliser un nouvelle installation pour déclencher l'invite ATT.

  • Tester tous les états : .authorized, .denied, .restricted, .notDetermined.

  • Activer/désactiver ATT dans Simulateur/Appareil physique sous Paramètres → Confidentialité et sécurité → Suivi.

  • Enregistrez les sorties pour confirmer que CMP est lancé uniquement après la résolution d'ATT.

Étape 11 : Meilleures pratiques

  • N'initialisez jamais les trackers avant la fin du flux ATT + CMP.
  • Utilisez les pré-invites avec sagesse ; n'induisez jamais les utilisateurs en erreur, car cela pourrait entraîner un blocage.
  • Ne chevauchez pas l’interface utilisateur CMP avec l’invite ATT.
  • Autoriser les utilisateurs à rouvrir le CMP à tout moment.
  • Attendez-vous à un rejet d'Apple Review si le suivi se produit avant l'autorisation d'ATT.

Étape 12 : Liste de contrôle du développeur

  • Ajouter AppTrackingTransparency.framework.

  • Ajouter NSUserTrackingUsageDescription vers Info.plist.

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

  • Afficher éventuellement une pré-invite.

  • Demandez ATT si .notDetermined.

  • Gérer le résultat ATT (accepter/rejeter les fournisseurs/objectifs en conséquence).

  • Lancez CMP une fois ATT terminé.

  • Initialisez/bloquez les SDK uniquement après la résolution du CMP.

  • Revérifiez ATT sur la reprise de l'application.

  • Fournir l'option de réouverture du CMP.

  • Tester tous les flux.


Références

Retour en haut de la page