Implementing App Tracking Transparency
1. Installing Tracking Module
| 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>
<<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'; const checkATT = async () => { const status = await trackingStatus(); console.log('Current tracking status:', status); if (status === 'not-determined') { const authStatus = await requestTrackingAuthorization(); console.log('Requested authorization:', authStatus); } };
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.