Skip to main content

Implementing App Tracking Transparency

1. Installing Tracking Module

Example: Install AppTrackingTransparency

npm install expo-apple-ads-tracking
Property Description Values
expo-apple-ads-tracking Module for handling App Tracking Transparency on iOS latest
Note: Requires iOS 14+ and appropriate permissions to function.

2. Requesting Tracking Permission

Permission Status Description
APP_TRACKING_TRANSPARENCY NEW Required for accessing app tracking transparency API

Example: Requesting Permission

import { request, PERMISSIONS } from 'react-native-permissions';

const requestTrackingPermission = async () => {
  const result = await request(PERMISSIONS.ANDROID.APP_TRACKING_TRANSPARENCY);
  console.log('Permission result:', result);
};
Note: On iOS, the user must have granted permission for tracking before the app can access the IDFA.

3. Getting Tracking Status

Example: Check tracking authorization status

import { getTrackingStatus } from 'expo-tracking';

const status = await getTrackingStatus();
console.log(status); // "authorized", "denied", "not-determined"
Return Value Description Notes
authorized User has granted permission Tracking is allowed
denied User has denied permission Tracking is disabled
not-determined User has not yet made a choice Can request permission
Note: On iOS, this requires the NSUserTrackingUsageDescription in your app.json.

4. Handling Permission Response

Property Description Values
status Current permission status granted, denied, not-determined, restricted
canAskAgain Indicates if the user can be asked again for permission true, false

Example: Check and handle permission response

import { request, PERMISSIONS, RESULTS } from 'react-native-permissions';

const handleTrackingPermission = async () => {
  const result = await request(PERMISSIONS.IOS.APP_TRACKING_TRANSPARENCY);
  
  switch (result) {
    case RESULTS.GRANTED:
      console.log('Tracking permission granted');
      break;
    case RESULTS.DENIED:
      console.log('Tracking permission denied');
      break;
    case RESULTS.UNAVAILABLE:
      console.log('Tracking permission not available');
      break;
  }
};

5. Configuring Info.plist

Property Value Description
NSUserTrackingUsageDescription "This app uses tracking to personalize your experience." Explanation shown to user when requesting tracking permission

Example: Info.plist Configuration

<key>NSUserTrackingUsageDescription</key>
&lt<string>This app uses tracking to personalize your experience.</string>

6. Implementing Permission Flow

Example: Requesting App Tracking Transparency Permission

import { request, PERMISSIONS, RESULTS } from 'react-native-permissions';

const requestTrackingPermission = async () => {
  const result = await request(PERMISSIONS.ANDROID.APP_TRACKING_PERMISSION);
  console.log('Permission result:', result);
};

requestTrackingPermission();
Permission Status Description
APP_TRACKING_PERMISSION NEW Android 13+ Permission to access app tracking information
Note: On Android 13+, users must explicitly grant the App Tracking Permission for tracking features to work.
Warning: If the permission is denied, tracking features may not function as expected.

7. Handling Denied Permission

Example: Check and handle denied permission

import { request, PERMISSIONS, RESULTS } from 'react-native-permissions';

const handleTrackingPermission = async () => {
  const result = await request(PERMISSIONS.IOS.APP_TRACKING_TRANSPARENCY);

  switch (result) {
    case RESULTS.DENIED:
      // User denied permission, show rationale or alternative
      console.log('Tracking permission denied');
      break;
    case RESULTS.BLOCKED:
      // User has blocked the permission, guide to settings
      console.log('Tracking permission blocked');
      break;
    case RESULTS.GRANTED:
      // Permission granted, proceed with tracking
      console.log('Tracking permission granted');
      break;
  }
};
Result Description Action
DENIED User denied the permission request Inform user and provide rationale or alternative actions
BLOCKED User has blocked the permission, cannot request again Guide user to settings to enable permission
GRANTED User has granted the permission Proceed with tracking logic
Note: When permission is blocked, users must manually enable it in their device settings.
Warning: If tracking is essential for your app's functionality, ensure you provide clear user guidance when permissions are denied or blocked.

8. Using IDFA

Property Description Values Notes
idfa Identifier for Advertiser null or string Used for tracking purposes in advertising
limitAdTracking Flag to limit ad tracking true or false When set to true, limits ad tracking

Example: Requesting IDFA

import { requestTrackingAuthorization } from 'expo-tracking';

const idfa = await requestTrackingAuthorization();
console.log(idfa);
Note: The IDFA is only accessible after the user has granted tracking authorization.

9. Checking ATT Availability

Property Description Availability
requestTrackingAuthorization Method to request tracking authorization from the user NEW in Expo SDK 50
trackingStatus Current tracking status of the app Available in Expo SDK 50+

Example: Checking ATT Availability

import { requestTrackingAuthorization, trackingStatus } from 'expo-tracking';&#10;&#10;const checkATT = async () => {&#10;  const status = await trackingStatus();&#10;  console.log('Current tracking status:', status);&#10;&#10;  if (status === 'not-determined') {&#10;    const authStatus = await requestTrackingAuthorization();&#10;    console.log('Requested authorization:', authStatus);&#10;  }&#10;};
Note: The requestTrackingAuthorization method is only available on iOS devices running iOS 14 or later.

10. Implementing Privacy Labels

Example: Privacy Labels Configuration

{
  "expo": {
    "privacyLabels": {
      "analytics": "Yes",
      "crashReporting": "Yes",
      "dataCollection": "Yes"
    }
  }
}
Label Value Description
analytics Yes Indicates if the app collects analytics data
crashReporting Yes Indicates if the app reports crashes
dataCollection Yes Indicates if the app collects user data
Note: Privacy labels are required for apps distributed on the App Store and Google Play.

Was this article helpful?