Apple advertising identifier integration and privacy considerations
This guide covers using the Identifier for Advertisers (IDFA) with the Permutive SDK, including App Tracking Transparency requirements and privacy best practices.
Permutive recommends against using IDFA for identity. Apple’s App Tracking Transparency (ATT) requirements significantly limit IDFA availability and utility. Consider using identifierForVendor or hashed email addresses instead.
import AppTrackingTransparencyimport AdSupportimport Permutive_iOSclass TrackingPermissionManager { func requestTrackingPermission() { // Only available on iOS 14+ if #available(iOS 14, *) { ATTrackingManager.requestTrackingAuthorization { status in switch status { case .authorized: self.setIDFAIdentity() case .denied: print("User denied tracking") case .restricted: print("Tracking restricted") case .notDetermined: print("Not determined") @unknown default: break } } } else { // iOS 13 and earlier - no ATT required setIDFAIdentity() } } private func setIDFAIdentity() { let idfa = ASIdentifierManager.shared().advertisingIdentifier // Check if IDFA is valid (not all zeros) guard idfa != UUID(uuidString: "00000000-0000-0000-0000-000000000000") else { print("IDFA not available (tracking denied or restricted)") return } do { try Permutive.shared.setIdentityForIDFA(idfa) print("IDFA set successfully") } catch { print("Failed to set IDFA: \(error)") } }}
func checkAndRequestTracking() { if #available(iOS 14, *) { let status = ATTrackingManager.trackingAuthorizationStatus switch status { case .notDetermined: // Can request permission requestTrackingPermission() case .authorized: // Already authorized setIDFAIdentity() case .denied, .restricted: // Cannot use IDFA useAlternativeIdentity() @unknown default: break } }}
Don’t request tracking permission immediately on app launch. Wait for an appropriate moment when the user understands the value.
Copy
Ask AI
// Good: Request after user has engaged with the appfunc onFirstContentView() { // User has started using the app requestTrackingPermission()}// Good: Request when user is about to see adsfunc onPrepareToPresentAds() { requestTrackingPermission()}// Bad: Requesting immediately on launchfunc applicationDidFinishLaunching() { // Don't do this - user hasn't understood the app yet // requestTrackingPermission()}
Problem: IDFA call fails with error.Cause: IDFA is all zeros (tracking denied/restricted).Solution: Check authorization status first and use alternative identifiers:
Copy
Ask AI
if ATTrackingManager.trackingAuthorizationStatus == .authorized { try Permutive.shared.setIdentityForIDFA(idfa)} else { setAlternativeIdentity()}
ATT prompt not appearing
Problem:requestTrackingAuthorization doesn’t show prompt.Possible Causes:
Missing NSUserTrackingUsageDescription in Info.plist
User already responded (check status first)
Running on iOS 13 or earlier
Running on simulator (may behave differently)
App rejected for IDFA usage
Problem: App Store rejects app for tracking without permission.Solution: Ensure you:
Request ATT permission before accessing IDFA
Have clear NSUserTrackingUsageDescription
Accurately declare data usage in App Store Connect