npm package: @moxspoy/react-native-idfa-aaid
Description: React Native module to get IDFA (iOS) or AAID (Android) with New Architecture support
Author: moxspoy
Latest version: 2.0.0

@moxspoy/react-native-idfa-aaid

# React Native module to get IDFA (iOS) or AAID (Android)

## Intro

[React Native](https://reactnative.dev/) is a framework for creating native mobile apps based on React.

The **Advertising Identifier** ([IDFA](https://developer.apple.com/documentation/adsupport/asidentifiermanager) on iOS, [AAID](https://developer.android.com/training/articles/ad-id) on Android) is a device-specific, unique, resettable ID for advertising that allows developers and marketers to track activity for advertising purposes.

This npm module allows any mobile application built with React Native to access the Advertising ID, following the OS specific definition and user permissions.

> **Note**: This is a maintained fork of the original `@sparkfabrik/react-native-idfa-aaid` package with React Native New Architecture (TurboModules) support and updated dependencies.

The module output in the RN framework is the following:

```ts
interface AdvertisingInfoResponse {
  id: string; // the Advertising ID (or null if not defined/permitted)
  isAdTrackingLimited: boolean; // the user defined permission to track
}
```

## Supported platform

- Android
- iOS

## Features

- ✅ React Native New Architecture (TurboModules) support
- ✅ Backward compatible with legacy architecture
- ✅ TypeScript support
- ✅ Updated dependencies compatible with Node.js 18+
- ✅ iOS 17.4+ bug fixes

## Installation

```sh
npm install @moxspoy/react-native-idfa-aaid
```

or

```sh
yarn add @moxspoy/react-native-idfa-aaid
```

Then run `pod install` in your `ios` folder after installation.

### Requirements

- React Native >= 0.70.0
- Node.js >= 18.0.0
- iOS >= 11.0
- Android minSdkVersion >= 21

## Migration from @sparkfabrik/react-native-idfa-aaid

If you're migrating from the original `@sparkfabrik/react-native-idfa-aaid` package:

1. Uninstall the old package:
   ```sh
   npm uninstall @sparkfabrik/react-native-idfa-aaid
   # or
   yarn remove @sparkfabrik/react-native-idfa-aaid
   ```

2. Install the new package:
   ```sh
   npm install @moxspoy/react-native-idfa-aaid
   # or
   yarn add @moxspoy/react-native-idfa-aaid
   ```

3. Update imports in your code:
   ```diff
   - import ReactNativeIdfaAaid from '@sparkfabrik/react-native-idfa-aaid';
   + import ReactNativeIdfaAaid from '@moxspoy/react-native-idfa-aaid';
   ```

4. Run `pod install` in your iOS directory

5. Rebuild your app - no code changes required, the API remains the same!

## React Native New Architecture Support

This package fully supports React Native's New Architecture (TurboModules). It automatically detects whether your app is using the new or legacy architecture and uses the appropriate implementation.

### Enabling New Architecture

To enable the New Architecture in your React Native app, follow the [official React Native documentation](https://reactnative.dev/docs/the-new-architecture/enable-new-architecture).

The package will automatically work with TurboModules when New Architecture is enabled in your app.

## Usage

### iOS configuration

For `native` apps, in `info.plist` make sure to add:

```xml
<key>NSUserTrackingUsageDescription</key>
<string>...</string>
```

For `Expo` apps, in `app.json` make sure to add:

```json
{
  "expo": {
    "plugins": [
      [
        "expo-tracking-transparency",
        {
          "userTrackingPermission": "..."
        }
      ]
    ]
  }
}
```

> **⚠️ iOS Simulator Note:** The iOS Simulator always returns a zeroed-out IDFA (`00000000-0000-0000-0000-000000000000`). This is expected Apple behavior. To test with real IDFA values, use a physical iOS device.

### React Native components

Example of a basic integration in a RN component.

```js
import ReactNativeIdfaAaid, { AdvertisingInfoResponse } from '@moxspoy/react-native-idfa-aaid';

const MyComponent: React.FC = () => {
  const [idfa, setIdfa] = useState<string | null>();

  useEffect(() => {
    ReactNativeIdfaAaid.getAdvertisingInfo()
      .then((res: AdvertisingInfoResponse) =>
        !res.isAdTrackingLimited ? setIdfa(res.id) : setIdfa(null),
      )
      .catch((err) => {
        console.log(err);
        return setIdfa(null);
      });
  }, []);
```

#### iOS 17.4

In order to prevent a bug present in iOS 17.4 we also expose the `getAdvertisingInfoAndCheckAuthorization(check: boolean)` which aims to solve the problem of `ATT Tracking Manager` returning status `denied` even if the ATT modal was not yet displayed to the user.

```js
import ReactNativeIdfaAaid, { AdvertisingInfoResponse } from '@moxspoy/react-native-idfa-aaid';

const MyComponent: React.FC = () => {
  const [idfa, setIdfa] = useState<string | null>();

  useEffect(() => {
    ReactNativeIdfaAaid.getAdvertisingInfoAndCheckAuthorization(true)
      .then((res: AdvertisingInfoResponse) =>
        !res.isAdTrackingLimited ? setIdfa(res.id) : setIdfa(null),
      )
      .catch((err) => {
        console.log(err);
        return setIdfa(null);
      });
  }, []);
```

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

MIT

## Credits

This package is a maintained fork of [@sparkfabrik/react-native-idfa-aaid](https://github.com/sparkfabrik/sparkfabrik-react-native-idfa-aaid). Original work by [Sparkfabrik](https://github.com/sparkfabrik).