# SDK para React Native

URL: https://traqio.app/es/docs/sdks/react-native
Last updated: 2026-10-22

Añade Traqio a una app React Native sin Expo: activa Expo Modules, instala @traqio/react-native, inicializa antes de registrar la app, configura iOS y Android.

`@traqio/react-native` es el SDK de Traqio para React Native. Incluye un módulo nativo con autolinking (Kotlin y Swift) y reexporta el motor JavaScript, [@traqio/core](https://traqio.app/es/docs/sdks/javascript), así que tu app lo importa todo desde un único paquete. Es el SDK verificado de principio a fin en un dispositivo: un clic, una instalación desde Google Play, el referrer leído en el primer arranque, una instalación atribuida de forma determinista. Para una app de Expo, sigue la [página de Expo](https://traqio.app/es/docs/sdks/expo).

## Requisitos

- React Native 0.74 o posterior.
- Expo Modules en el proyecto (`npx install-expo-modules@latest`): la mitad nativa es un módulo de Expo.
- iOS 15.1 o posterior. Android no necesita ningún permiso (salvo que actives el identificador publicitario).

## Configuración

### Activa Expo Modules

```bash
npx install-expo-modules@latest
```

Una vez por proyecto. Sáltatelo si tu app ya usa algún módulo de Expo.

### Instala el paquete

```bash
npm install @traqio/react-native @react-native-async-storage/async-storage
cd ios && pod install
```

AsyncStorage es lo que hace que la instalación se envíe exactamente una vez y conserva los eventos en cola entre reinicios; el SDK lo detecta por sí solo cuando está instalado. Sin él, el SDK muestra una advertencia y vuelve a informar de la instalación en cada arranque.

### Inicializa antes de registrar la app

index.js:
```js
// index.js — before AppRegistry.registerComponent
import { Traqio, getNativeBridge } from "@traqio/react-native";
import { version } from "./package.json";

Traqio.init({
  sdkKey: "YOUR_SDK_KEY",
  endpoint: "https://api.traqio.app",
  native: getNativeBridge(),
  appVersion: version,
});
```

Inicializar antes de `AppRegistry.registerComponent` significa que el SDK ya está escuchando cuando se entrega la URL que abrió la app. La llamada es idempotente.

### Declara el endpoint de SKAdNetwork

ios/YourApp/Info.plist:
```xml
<key>NSAdvertisingAttributionReportEndpoint</key>
<string>https://api.traqio.app</string>
```

iOS envía entonces a Traqio una copia de cada postback de SKAdNetwork de tu app. Solo el origen: iOS añade su propia ruta.

### Registra eventos y define el id de usuario

```ts
Traqio.setUserId(user.id); // after sign-in — same id as RevenueCat's app_user_id

Traqio.track("purchase", { value: 9.99, currency: "EUR", transactionId: purchase.transactionId });
```

Consulta [Eventos e ingresos](https://traqio.app/es/docs/concepts/events-and-revenue) para conocer los nombres con los que Meta y TikTok pueden optimizar, y por qué importa `transactionId`.

## Deep links

El SDK escucha él mismo el `Linking` de React Native (la URL inicial y todas las posteriores) y pasa los enlaces de Traqio a tu callback:

```ts
Traqio.onDeepLink(({ deepLink }) => {
  if (deepLink) navigation.navigate(...routeFor(deepLink)); // your router's call
});
```

Los enlaces solo abren la app si la app declara tu dominio de marca:

```xml
<!-- android/app/src/main/AndroidManifest.xml, inside the main <activity> -->
<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="https" android:host="go.example.com" android:pathPrefix="/c/" />
</intent-filter>
```

En iOS, añade `applinks:go.example.com` en Signing & Capabilities → Associated Domains, y deja que React Native reciba los universal links como de costumbre:

AppDelegate.mm:
```objc
// AppDelegate — hand universal links to React Native's Linking, as usual
- (BOOL)application:(UIApplication *)application
    continueUserActivity:(NSUserActivity *)userActivity
      restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *))restorationHandler {
  return [RCTLinkingManager application:application
                   continueUserActivity:userActivity
                     restorationHandler:restorationHandler];
}
```

El dominio en sí se configura en la consola; consulta [Deep linking](https://traqio.app/es/docs/concepts/deep-linking).

## Notas por plataforma

### Android

- El módulo declara la entrada `<queries>` que le permite ver Google Play en Android 11+; no hace falta ningún cambio en el manifest para la atribución.
- Si Google Play no responde en el primer arranque, la instalación se retiene y se reintenta en los siguientes arranques (hasta tres) en lugar de informarse como orgánica.

### iOS

- El SDK no necesita ni muestra ningún aviso de App Tracking Transparency.
- Los valores de conversión siguen el mapeo que publicas en la consola. Si tu app ya gestiona su propio esquema de valores de conversión, desactiva el del SDK con `skan: false`: dos escritores se pelearían por los mismos seis bits.

## Identificador publicitario (opcional)

Desactivado por defecto: el SDK no envía ni IDFA ni GAID. Activa `collectAdvertisingId` solo si compras en redes que atribuyen por el identificador publicitario — Unity Ads y AppLovin vinculan su clic con tu instalación gracias a él. Se envía con la instalación y nunca se usa como su identidad.

```ts
Traqio.init({
  sdkKey: "YOUR_SDK_KEY",
  endpoint: "https://api.traqio.app",
  native: getNativeBridge(),
  collectAdvertisingId: true, // off by default
});
```

- iOS: el SDK nunca muestra el aviso de App Tracking Transparency — pídelo tú antes de `init` y enlaza AdSupport. El IDFA solo se lee si el usuario ya permitió el seguimiento.
- Android: añade `com.google.android.gms:play-services-ads-identifier` y el permiso`com.google.android.gms.permission.AD_ID` a tu app; el SDK no declara ninguno de los dos.
- Declara el identificador publicitario en los detalles de privacidad de la App Store y en el formulario de Seguridad de los datos de Google Play.

> **API completa** Todas las opciones y métodos se documentan una sola vez, en la referencia de la API de JavaScript.

## Preguntas frecuentes

**¿Por qué una app de React Native sin Expo necesita Expo Modules?**
La mitad nativa del SDK (el lector del Install Referrer en Android, el gestor de SKAdNetwork en iOS) está escrita como un módulo de Expo, así que necesita el pequeño runtime de Expo Modules que install-expo-modules añade a un proyecto bare. No convierte la app en una app gestionada por Expo ni añade ningún servicio de Expo.

**¿Tengo que vaciar la cola de eventos o informar de las aperturas de la app yo mismo?**
No. En React Native el SDK escucha AppState: envía la cola cuando la app pasa a segundo plano y registra una apertura de la app cuando vuelve tras 30 minutos o más. Los entornos sin el AppState de React Native, como Capacitor, llaman ellos mismos a flush() y appOpened().
