[iOS] 4. Praca z ATT (App Tracking Transparency / iOS)

Praca z ATT (App Tracking Transparency) na iOS

ATT i zarządzanie zgodami to oddzielne systemy, które musisz koordynować ręcznie. 

W tym przewodniku wyjaśniono, jak poprawnie zintegrować framework Apple App Tracking Transparency (ATT) z naszym SDK CMP. ATT jest wymogiem na poziomie platformy (Apple), podczas gdy CMP zarządza zgodami prawnymi/regulacyjnymi. Oba muszą współpracować, aby zapewnić zgodność z przepisami i prawidłowe działanie SDK.

Monit dotyczący przejrzystości śledzenia w aplikacjach na iOS (ATT) oraz zarządzanie zgodami zgodnie z RODO/ePrivacy

serve different purposes

i działać

independently

Zalecamy sprawdzenie, czy 

no SDK whatsoever

 jest ładowana 

before

 nasze okno dialogowe ATT 

and before

nasze SDK. W oparciu o wybory dokonane przez użytkownika na 

both

okno dialogowe ATT i nasza warstwa zgody, ładują lub nie ładują podane SDK. 

Dla wyjaśnienia:

  • Okno dialogowe ATT oraz warstwa zgody (CMP) dotyczą różnych podstaw prawnych i zakresów.

    • ATT to mechanizm firmy Apple służący do uzyskiwania zgody użytkownika na śledzenie między aplikacjami (tj. udostępnianie identyfikatorów, takich jak IDFA, stronom trzecim w celach reklamowych).

    • Warstwa zgody (CMP) reguluje wykorzystanie plików cookie i SDK do celów takich jak analityka, personalizacja, pomiary lub podstawowe funkcje aplikacji — zgodnie z wymogami RODO/ePrivacy i podobnych przepisów. Jako przykłady można wymienić Firebase (GFA), Crashlytics, OneSignal, MixPanel, Sentry itp. Żadna z tych usług nie jest bezpośrednio powiązana z ATT, ale i tak konieczne jest uzyskanie zgody użytkownika. 

Nawet jeśli użytkownik wybierze opcję „Poproś aplikację, aby nie śledziła” na poziomie systemu w systemie iOS, Twoja aplikacja może nadal przetwarzać pewne rodzaje danych (na przykład funkcjonalne pliki cookie, SDK do pomiarów lub inne narzędzia techniczne), które wymagają podstawy prawnej lub zgody zgodnie z przepisami o ochronie prywatności. Dlatego warstwa zgody musi być nadal wyświetlana, aby użytkownik mógł dokonać wyboru dotyczącego tych technologii. Upewnij się, że nie jest to Twój przypadek, ponieważ jeśli zdecydujesz się nie wyświetlać warstwy zgody, ale nadal będziesz ładować jakiekolwiek SDK, które przesyła dane z urządzenia na serwery, nawet w różnych celach lub do różnych dostawców, Twoja aplikacja zostanie zablokowana.

Krok 1: Wymagania wstępne

  • Minimalna wersja iOS: iOS 14 (funkcja ATT niedostępna w starszych wersjach)

  • Dodaj bibliotekę AppTrackingTransparency.framework do swojego projektu

  • W pliku Info.plist dodaj:

<key>NSUserTrackingUsageDescription</key> 
<string>This identifier will be used to deliver personalized ads and improve user experience.</string>
  • Tekst musi jasno wyjaśniać, dlaczego prosisz o śledzenie

Apple może odrzucić niejasne sformułowania.

Wszystkie operacje związane z ATT muszą być zarządzane w samej aplikacji mobilnej, a nie za pośrednictwem naszego SDK, ponieważ nasze SDK nie rozpoznaje cyklu życia aplikacji mobilnej, w której jest zintegrowane. Żądanie ATT musi zostać wyświetlone i całkowicie obsłużone przed naszym SDK, a okno dialogowe ATT nie powinno być ładowane w tym samym czasie ani na naszej warstwie zgody. Upewnij się, że ładujesz naszą warstwę zgody wyłącznie poprzez checkAndOpen() lub forceOpen() po obsłużeniu żądania ATT i upewnieniu się, że wybór użytkownika dotyczący ATT został już zaktualizowany na urządzeniu. Nie ładuj naszej warstwy zgody przed tym. 

Krok 2: Sprawdź status ATT

Sprawdź aktualny status autoryzacji ATT przed zainicjowaniem działania SDK do śledzenia:

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

 

Krok 3: Poproś o autoryzację ATT

Jeśli status wynosi .notDetermined, poproś o autoryzację, gdy aplikacja jest aktywna:

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

Krok 4: Obsługa wyników ATT

Określ, jak przetworzyć wynik ATT, a następnie uruchom CMP:

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

 

Krok 5: Uruchom CMP

Po rozwiązaniu kwestii ATT, ustal status ATT w interfejsie CMP, aby można było otworzyć interfejs CMP w celu uzyskania zgody prawnej/regulacyjnej przy użyciu ukierunkowanego projektu:

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

 

Krok 6: Tabela decyzyjna — ATT × Zachowanie CMP × Działania SDK

Status ATT IDFA Zachowanie CMP Działania SDK
.notDetermined Nie Poczekaj na monit ATT, a następnie uruchom CMP. Nie inicjuj jeszcze trackerów.
.authorized Tak Zbierz szczegółową zgodę CMP. Włącz reklamy/analizy tylko wtedy, gdy zezwala na to CMP.
.denied Nie Traktuj reklamy/profilowanie jako odrzucone. Odrzucaj cele reklamowe/dostawców programowo, a następnie wyświetlaj CMP dla celów innych niż śledzenie.
.restricted Nie Tak samo jak w przypadku „Odrzucone”. Odrzuć cele reklamowe/dostawców, a następnie otwórz CMP.
iOS < 14 N/A Pomiń ATT, używaj wyłącznie CMP. Blokuj do czasu rozwiązania przez CMP.

Krok 7: Przepisy na API uwzględniające ATT

Odrzuć cele reklamowe/dostawców, gdy ATT jest zablokowane lub ograniczone

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

(LUB) Cele reklamowe/dostawcy przed przyznaniem licencji, gdy ATT wyrazi zgodę

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

 

Krok 8: Ponowna kontrola w aplikacji Resume

ATT można zmienić w Ustawieniach. Zawsze sprawdź ponownie w CV:

Krok 9: Przypadki skrajne i rozwiązania awaryjne

  • Ograniczone: ATT niedostępne (np. kontrola rodzicielska). Zablokuj śledzenie.

  • iOS < 14: Brak ATT → używaj tylko CMP.

  • Komenda niedostępna: należy zażądać ATT, gdy aplikacja jest aktywna.

  • Odrzucenie przez użytkownika: Traktuj cele reklamowe/dostawców jako odrzucone.

Krok 10: Testowanie i usuwanie błędów

  • Użyj świeżej instalacji, aby wywołać monit ATT.

  • Sprawdź wszystkie stany: .authorized, .denied, .restricted, .notDetermined.

  • Włącz ATT w Simulatorze/Urządzeniu fizycznym w Ustawieniach → Prywatność i bezpieczeństwo → Śledzenie.

  • Rejestruj wyniki, aby potwierdzić, że CMP uruchamia się dopiero po rozwiązaniu ATT.

Krok 11: Najlepsze praktyki

  • Nigdy nie inicjuj trackerów przed zakończeniem procesu ATT + CMP.
  • Mądrze korzystaj z podpowiedzi; nigdy nie wprowadzaj użytkowników w błąd, ponieważ może to prowadzić do zablokowania.
  • Nie nakładaj interfejsu użytkownika CMP na monit ATT.
  • Pozwól użytkownikom na ponowne otwarcie CMP w dowolnym momencie.
  • Spodziewaj się odrzucenia przez Apple Review, jeśli śledzenie nastąpi przed uzyskaniem zgody ATT.

Krok 12: Lista kontrolna dla programisty

  • Dodaj AppTrackingTransparency.framework.

  • Dodaj NSUserTrackingUsageDescription do pliku Info.plist.

  • Sprawdź status ATT przy uruchomieniu.

  • Opcjonalnie wyświetl podpowiedź.

  • Poproś o ATT, jeśli .notDetermined.

  • Postępuj zgodnie z wynikiem ATT (odpowiednio akceptuj/odrzucaj dostawców/cele).

  • Uruchom CMP po zakończeniu ATT.

  • Zainicjuj/zablokuj SDK dopiero po rozwiązaniu CMP.

  • Sprawdź ponownie ATT w opisie aplikacji.

  • Zapewnij opcję ponownego otwarcia CMP.

  • Przetestuj wszystkie ścieżki.


Referencje

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!