A library for requesting permission to track the users on devices using iOS 14 and higher.
A library for requesting permission to track the user or their device. Examples of data used for tracking include email address, device ID, advertising ID, and more. This permission is only necessary on iOS 14 and higher; on iOS 13 and below this permission is always granted. If the "Allow Apps to Request to Track" device-level setting is off, this permission will be denied. Be sure to add NSUserTrackingUsageDescription
to your Info.plist to explain how the user will be tracked. Otherwise, your app will be rejected by Apple.
For more information on Apple's new App Tracking Transparency framework, see their documentation.
-
npx expo install expo-tracking-transparency
If you are installing this in an existing React Native app, start by installing expo
in your project. Then, follow the additional instructions as mentioned by the library's README under "Installation in bare React Native projects" section.
You can configure expo-tracking-transparency
using its built-in config plugin if you use config plugins in your project (EAS Build or npx expo run:[android|ios]
). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
Learn how to configure the native projects in the installation instructions in the expo-tracking-transparency
repository.
{
"expo": {
"plugins": [
[
"expo-tracking-transparency",
{
"userTrackingPermission": "This identifier will be used to deliver personalized ads to you."
}
]
]
}
}
Name | Default | Description |
---|---|---|
userTrackingPermission | "Allow this app to collect app-related data that can be used for tracking you or your device." | Only for: iOS Sets the iOS |
import { useEffect } from 'react';
import { Text, StyleSheet, View } from 'react-native';
import { requestTrackingPermissionsAsync } from 'expo-tracking-transparency';
export default function App() {
useEffect(() => {
(async () => {
const { status } = await requestTrackingPermissionsAsync();
if (status === 'granted') {
console.log('Yay! I have user permission to track data');
}
})();
}, []);
return (
<View style={styles.container}>
<Text>Tracking Transparency Module Example</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});
import * as ExpoTrackingTransparency from 'expo-tracking-transparency';
useTrackingPermissions(options)
Parameter | Type |
---|---|
options (optional) | PermissionHookOptions<object> |
[null | PermissionResponse, RequestPermissionMethod<PermissionResponse>, GetPermissionMethod<PermissionResponse>]
getAdvertisingId()
Gets the advertising ID, a UUID string intended only for advertising. Use this string for frequency capping, attribution, conversion events, estimating the number of unique users, advertising fraud detection, and debugging.
As a best practice, don't store the advertising ID. Instead, call this function each time your
app needs to use the advertising ID. Users can change whether they allow app tracking and can
reset their advertising ID at any time in their system settings. Check your app's authorization
using getTrackingPermissionsAsync()
to determine the user's intent.
On Android, this function returns the "Android Advertising ID" (AAID). On Android devices that support multiple users, including guest users, it's possible for your app to obtain different advertising IDs on the same device. These different IDs correspond to different users who could be signed in on that device. See Google's documentation for more information: Get a user-resettable advertising ID.
On iOS, this function returns the "Identifier for Advertisers"
(IDFA),
a string that's unique to each device. On devices running iOS 14.5 and newer, your app must
request tracking authorization using requestTrackingPermissionsAsync()
before it can get the
advertising identifier.
string | null
Returns either a UUID string
or null
. It returns null in the following cases:
isLimitAdTrackingEnabled()
is true
requestTrackingPermissionsAsync()
Example
TrackingTransparency.getAdvertisingId();
// "E9228286-4C4E-4789-9D95-15827DCB291B"
getTrackingPermissionsAsync()
Checks whether or not the user has authorized the app to access app-related data that can be used
for tracking the user or the device. See requestTrackingPermissionsAsync
for more details.
On Android, web, and iOS 13 and below, this method always returns that the permission was granted.
Example
const { granted } = await getTrackingPermissionsAsync();
if (granted) {
// Your app is authorized to track the user or their device
}
isAvailable()
Returns whether the TrackingTransparency API is available on the current device.
boolean
On devices where the Tracking Transparency API is unavailable,
the get and request permissions methods will always resolve to granted
.
requestTrackingPermissionsAsync()
Requests the user to authorize or deny access to app-related data that can be used for tracking the user or the device. Examples of data used for tracking include email address, device ID, advertising ID, etc. On iOS 14.5 and above, if the user denies this permission, any attempt to collect the IDFA will return a string of 0s.
The system remembers the user’s choice and doesn’t prompt again unless a user uninstalls and then reinstalls the app on the device.
On Android, web, and iOS 13 and below, this method always returns that the permission was granted.
Example
const { granted } = await requestTrackingPermissionsAsync();
if (granted) {
// Your app is authorized to track the user or their device
}
PermissionResponse
An object obtained by permissions get and request functions.
PermissionResponse Properties
Name | Type | Description |
---|---|---|
canAskAgain | boolean | Indicates if user can be asked again for specific permission. If not, one should be directed to the Settings app in order to enable/disable the permission. |
expires | PermissionExpiration | Determines time when the permission expires. |
granted | boolean | A convenience boolean that indicates if the permission is granted. |
status | PermissionStatus | Determines the status of the permission. |
PermissionExpiration
Literal Type: multiple types
Permission expiration time. Currently, all permissions are granted permanently.
Acceptable values are: 'never'
| number
PermissionHookOptions
Literal Type: multiple types
Acceptable values are: PermissionHookBehavior
| Options
UNDETERMINED
PermissionStatus.UNDETERMINED = "undetermined"
User hasn't granted or denied the permission yet.
Android Permission | Description |
---|
The following usage description keys are used by this library:
Info.plist Key | Description |
---|---|
A message that informs the user why an app is requesting permission to use data for tracking the user or the device. |