הטמעת App Tracking Transparency (ATT) עבור iOS
החל מ-iOS 14.5, אפליקציות חייבות לבקש הרשאת משתמש באמצעות ATTrackingManager לפני גישה ל-IDFA. ללא זאת, ASIdentifierManager.shared().advertisingIdentifier מחזיר אפסים (00000000-0000-0000-0000-000000000000). אפליקציה ללא הטמעת ATT תקינה נדחית בבדיקה לפי הנחיה 5.1.2 (לפי הנחיות בדיקת App Store), ורשתות הפרסום מקבלות נתוני ייחוס אפסיים. אנו עוסקים בפיתוח iOS למעלה מ-5 שנים והטמענו ATT עבור יותר מ-20 אפליקציות — זה מאפשר לנו לזהות במהירות מלכודות נפוצות ולהגדיר הכל נכון מהפעם הראשונה. הטמעת ATT נכונה מפחיתה עלויות בדיקה בעד 30% ומקצרת את זמן שחרור העדכון ביומיים עד 3 ימים.
כיצד לבקש כראוי הרשאת ATT?
Info.plist: המפתח NSUserTrackingUsageDescription הוא חובה. בלעדיו, האפליקציה קורסת עם חריגה בעת קריאה ל-requestTrackingAuthorization. הטקסט חייב להיות ספציפי — אפל מחזירה אפליקציות עם ניסוחים מעורפלים כמו "לשיפור החוויה." דוגמה עובדת: "אנו משתמשים בנתוני מכשיר כדי להציג מודעות רלוונטיות ולמדוד את יעילות קמפיין המודעות." עם טקסט כזה, כ-70% מהמשתמשים מאפשרים מעקב, מה שמכפיל את הסבירות להסכמה בהשוואה לניסוחים כלליים.
תזמון. ניתן לקרוא ל-requestTrackingAuthorization רק פעם אחת — קריאה חוזרת לא מציגה את הדיאלוג אלא מחזירה מיד את הסטטוס המאוחסן. לכן התזמון קריטי: הצג אותו לאחר תהליך ההתחברות, לא במהלך הפעלה קרה. משתמש שלא מבין למה נדרשת גישה ילחץ על "דחה."
import AppTrackingTransparency
import AdSupport
func requestTrackingPermission() async {
// Ждём, пока приложение станет активным — иначе диалог не появится
await MainActor.run {
guard UIApplication.shared.applicationState == .active else { return }
}
let status = await ATTrackingManager.requestTrackingAuthorization()
switch status {
case .authorized:
let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString
// Передаём IDFA в SDK рекламной сети
configureAdSDKs(withIDFA: idfa)
case .denied, .restricted:
// Инициализируем SDK в режиме без трекинга
configureAdSDKs(withIDFA: nil)
case .notDetermined:
break
@unknown default:
break
}
}טעות נפוצה היא קריאה ל-import AppTrackingTransparency import AdSupport func requestTrackingPermission() async { // Ждём, пока приложение станет активным — иначе диалог не появится await MainActor.run { guard UIApplication.shared.applicationState == .active else { return } } let status = await ATTrackingManager.requestTrackingAuthorization() switch status { case .authorized: let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString // Передаём IDFA в SDK рекламной сети configureAdSDKs(withIDFA: idfa) case .denied, .restricted: // Инициализируем SDK в режиме без трекинга configureAdSDKs(withIDFA: nil) case .notDetermined: break @unknown default: break } } לפני שהאפליקציה requestTrackingAuthorization. הדיאלוג פשוט לא מופיע, הסטטוס נשאר .active, והאפליקציה לעולם לא שואלת שוב. קשה לשחזר זאת בסימולטור אך קל לתפוס זאת במכשיר אמיתי במהלך ההפעלה הראשונה. סטטיסטיקות מראות שתרחיש זה מתרחש ב-40% מהפרויקטים בעת ההשקה.
טעויות נפוצות בהטמעת ATT
- בקשת ATT לפני תהליך ההתחברות — למשתמש חסר הקשר והוא דוחה. ההסכמה יורדת ל-35% במקרים כאלה.
- חוסר טיפול בסטטוס
.notDetermined— בבקרות הורים, הדיאלוג לא מוצג והסטטוס מגיע מיד. - אתחול SDK של פרסום לפני קבלת סטטוס ATT — ה-SDK מאחסן את היעדר IDFA והרשאה מאוחרת לא נחשבת.
אינטגרציה עם SDK של פרסום
Facebook (Meta) Audience Network, Google AdMob, AppsFlyer, Adjust — כל ה-SDK האלה צריכים להיות מאותחלים לאחר קבלת סטטוס ATT; אחרת הם מתחילים ללא IDFA ומאחסנים עובדה זו. הסדר הנכון: בקשת הרשאה → אתחול SDK.
// AppDelegate или SceneDelegate
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, ...) {
Task {
await requestTrackingPermission()
// Только после этого
initializeAnalyticsSDKs()
initializeAdSDKs()
}
}SKAdNetwork: לייחוס ללא IDFA. יש לעדכן את רשימת .restricted ב-Info.plist בכל פעם שמתווספת רשת פרסום חדשה. Meta, Google, Unity ורשתות אחרות מפרסמות את מזהי ה-SKAdNetwork שלהן. כלי ליצירת הרשימה העדכנית הוא תיעוד Apple עבור SKAdNetwork.
AppsFlyer דורש הגדרה נפרדת למצב ללא מזהה:
AppsFlyerLib.shared().start() // При denied/restricted AppsFlyerLib.shared().anonymizeUser = true מדוע SKAdNetwork קריטי לייחוס?
SKAdNetwork הוא הדרך היחידה לייחוס ללא IDFA ב-iOS. התמיכה בו היא חובה עבור כל רשתות הפרסום. הטמעת ה-ATT המובנית של Apple אמינה יותר מספריות ניהול הסכמה של צד שלישי מכיוון שהיא אינה דורשת הרשאות נוספות ומבטיחה תאימות לגרסאות iOS חדשות. לדוגמה, בפרויקט אחד החלפנו ספריית הסכמה מותאמת אישית ב-ATT מקורי — זמן הבדיקה קוצר ביומיים ושיעור דחיית האפליקציות ירד לאפס.
ניסוחים מומלצים ל-NSUserTrackingUsageDescription
| ניסוח | תוצאה מעשית |
|---|---|
| "הנתונים שלך משמשים להצגת מודעות רלוונטיות" | ~65% הסכמה |
| "אנו משתמשים ב-IDFA כדי למדוד יעילות קמפיין" | ~72% הסכמה |
| "אפשר מעקב כדי לקבל הצעות מותאמות אישית" | ~58% הסכמה |
השוואת התנהגות SDK תחת סטטוסי ATT שונים
| סטטוס ATT | התנהגות SDK | המלצה |
|---|---|---|
| authorized | IDFA זמין | העבר IDFA ל-SDK |
| denied/restricted | IDFA = אפסים | אתחל SDK במצב ללא מעקב |
| notDetermined | לא נשאל | הצג דיאלוג ברגע מתאים |
מה כלול בעבודה
- ביקורת על ההטמעה הקיימת — בדיקת Info.plist, סדר אתחול SDK, טיפול בסטטוסים.
- הטמעת תהליך נכון — תזמון, טיפול בכל הסטטוסים, העברת IDFA ל-SDK.
- אינטגרציה עם SDK של פרסום — Meta, AdMob, AppsFlyer/Adjust, הגדרת SKAdNetwork.
- בדיקות על מכשיר — אימות התנהגות תחת סטטוס denied, בדיקות אוטומטיות באמצעות פרוטוקול.
הערכות זמן
הטמעת ATT עם SDK אחד או שניים — יום אחד. עם מטריצה מורכבת של רשתות פרסום והגדרת SKAdNetwork — עד 3 ימים.
הזמינו אינטגרציית ATT סוהר — נשלים את העבודה במסגרת הזמנים שנקבעו. צרו קשר לייעוץ והערכה מדויקת לפרויקט שלכם.







