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 purposesi działać
independentlyZalecamy sprawdzenie, czy
no SDK whatsoeverjest ładowana
beforenasze okno dialogowe ATT
and beforenasze SDK. W oparciu o wybory dokonane przez użytkownika na
bothokno 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
NSUserTrackingUsageDescriptiondo 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.