App Tracking Transparency framework

If you want to record the device's ID for Advertisers (IDFA), you must display a prompt in your app to gather the user's consent. To do this, you need to use Apple's App Tracking Transparency (ATT) framework. Once the user has made their choice, the Adjust SDK will store this information. The Adjust SDK will then attach this information to each packet it sends to the Adjust backend.

Note:

This feature requires Adjust SDK v4.28.0 and later.

The Adjust SDK will record the user's decision as one of the following states:

StateMeaning
AuthorizedThe user has approved access to app-related data for device tracking.
DeniedThe user has denied access to app-related data for device tracking.
Not determinedThe user has not yet responded to the prompt for access.
RestrictedAccess to app-related data is blocked at the device level.

The Adjust SDK has a built-in wrapper around Apple's tracking authorization method. You can use this wrapper if you do not want to customize the ATT prompt. The Adjust SDK will listen for changes to the authorization status and send it to the Adjust backend.

If you are using your own ATT prompt, you do not need to use the wrapper method. You will need to include the AppTrackingTransparency.framework in your application setup. You can show your prompt either before or after initializing the Adjust SDK. If before, the Adjust SDK will attach the authorization status to the install event. If after, the Adjust SDK will send the authorization status to the backend once it has recorded it.

App-tracking authorization wrapper

The Adjust SDK includes a wrapper built on top of the requestTrackingAuthorizationWithCompletionHandler method. You can use this wrapper to gather information about the user's authorization status. You can also use this method to define callbacks for each response value. When the user interacts with the authorization dialog, they will trigger your callback. The Adjust SDK will also inform the Adjust backend of the user's choice. The callback will return an integer value displaying the authorization status.

Objective-C
[Adjust requestTrackingAuthorizationWithCompletionHandler:^(NSUInteger status) {
    switch (status) {
        case 0:
            // ATTrackingManagerAuthorizationStatusNotDetermined case
            break;
        case 1:
            // ATTrackingManagerAuthorizationStatusRestricted case
            break;
        case 2:
            // ATTrackingManagerAuthorizationStatusDenied case
            break;
        case 3:
            // ATTrackingManagerAuthorizationStatusAuthorized case
            break;
    }
}];

Get current authorization status

You can call the appTrackingAuthorizationStatus method to return the current authorization status. The SDK will return an integer value relating to the authorization status.

Objective-C
Swift
Javascript
int authorizationStatus = [Adjust appTrackingAuthorizationStatus];

Check for authorization status change

The Adjust SDK automatically reads any change in the user's authorization status from the ATT prompt when you use the ATT wrapper. If you are not using the wrapper, you need to read the status after the user makes their choice. Use the checkForNewAttStatus method to read the new status and send it to the Adjust backend.

Note:

You need to check the user's authorization status any time they change it.

Objective-C
Swift
[Adjust checkForNewAttStatus];

Custom prompt timing

If your app includes an onboarding process or a tutorial, you may want to delay sending your user's ATT consent status until after the user has completed this process. To do this, you can set the attConsentWaitingInterval property to delay the sending of data for up to 120 seconds to give the user time to complete the initial onboarding. After the timeout ends or the user sets their consent status, the SDK sends all information it has recorded during the delay to Adjust's servers along with the user's consent status.

Note:

If the user closes the app before the timeout ends, or before they select their consent status, the timeout restarts when they reopen the app.

Swift
Objective-C
let yourAppToken = "{YourAppToken}"
let environment = ADJEnvironmentSandbox as? String
let myConfig = ADJConfig(
    appToken: yourAppToken,
    environment: environment)
//...
myConfig?.attConsentWaitingInterval = 30
//...
Adjust.appDidLaunch(myConfig)

iOS 17 consent handling

With the release of iOS 17, Apple implemented new rules on what data developers may send to third-parties. To ensure that developers can easily demonstrate compliance with Apple’s privacy guidelines, the Adjust SDK makes use of two separate endpoints for consenting and non-consenting users.

By default, the Adjust SDK sends a limited set of data to Adjust’s servers for probabilistic modeling using the analytics.adjust.com endpoint. This endpoint doesn’t receive the following information:

  • idfa: The device ID For Advertisers (IDFA).
  • started_at: The device startup time.

Only if the user grants ATT consent, the Adjust SDK gains access to both the idfa and started_at properties for deterministic attribution and sends the full payload to consent.adjust.com.

Both of these endpoints are available for all URL strategies.

URL strategyNon-consented endpointConsented endpoint
ADJDataResidencyEUanalytics.eu.adjust.comconsent.eu.adjust.com
ADJDataResidencyTRanalytics.tr.adjust.comconsent.tr.adjust.com
ADJDataResidencyUSanalytics.us.adjust.comconsent.us.adjust.com
ADJUrlStrategyChinaanalytics.adjust.worldconsent.adjust.world
ADJUrlStrategyCnanalytics.adjust.cnconsent.adjust.cn
ADJUrlStrategyIndiaanalytics.adjust.net.inconsent.adjust.net.in