---
title: React Native
description: Integra la jornada Human Token en tu aplicación React Native — ASWebAuthenticationSession en iOS y Custom Tabs en Android a través de un módulo nativo.
canonical: https://developer.unico.io/es/human-token/integrations/app/react-native
locale: es
generated_by: markdown-export
---

- [/es/](/es/)
- [Integraciones](/es/human-token/integrations)
- App
- React Native

**En esta páginaReact NativeIntegra la jornada Human Token en tu aplicación React Native a través de un módulo nativo.

La integración usa un módulo nativo que delega a `ASWebAuthenticationSession` en iOS y Custom Tabs en Android. Cuando la jornada finaliza, el módulo nativo resuelve la promesa con la URL de callback.
### Requisitos previos​

React Native 0.71 o posterior
Xcode 14+ para iOS
Android Studio para Android
Un esquema de URL único para tu aplicación (por ejemplo, `myapp`)

### Paso 1: Definir tu esquema de URL​

Elige un esquema único (por ejemplo, `myapp`). Se usa como `callbackUri` al crear el proceso:
```
callbackUri: myapp://callback
```

### Paso 2: Crear el puente TypeScript​

```
// src/modules/UnicoModule.tsimport { NativeModules } from 'react-native';const { UnicoModule } = NativeModules;if (!UnicoModule) {  throw new Error('UnicoModule not found. Make sure the native module is linked correctly.');}export const Unico = {  openSession: (url: string): Promise<string> => UnicoModule.openSession(url),};
```

### Paso 3: Implementar el módulo nativo de iOS​

Objective-C bridgeSwift implementation```
// ios/UnicoModule.m#import <React/RCTBridgeModule.h>@interface RCT_EXTERN_MODULE(UnicoModule, NSObject)RCT_EXTERN_METHOD(openSession:(NSString *)url                  resolve:(RCTPromiseResolveBlock)resolve                  reject:(RCTPromiseRejectBlock)reject)@end
```

```
// ios/UnicoModule.swiftimport AuthenticationServices@objc(UnicoModule)class UnicoModule: NSObject, ASWebAuthenticationPresentationContextProviding {    private var session: ASWebAuthenticationSession?    @objc func openSession(_ url: String,                           resolve: @escaping RCTPromiseResolveBlock,                           reject: @escaping RCTPromiseRejectBlock) {        guard let sessionURL = URL(string: url) else {            reject("INVALID_URL", "Invalid URL", nil)            return        }        DispatchQueue.main.async {            let newSession = ASWebAuthenticationSession(                url: sessionURL,                callbackURLScheme: "myapp"            ) { callbackURL, error in                self.session = nil                if let callbackURL = callbackURL {                    resolve(callbackURL.absoluteString)                } else {                    reject("SESSION_ERROR", error?.localizedDescription ?? "Session cancelled", error)                }            }            newSession.presentationContextProvider = self            newSession.prefersEphemeralWebBrowserSession = true            newSession.start()            self.session = newSession        }    }    func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,              let window = windowScene.windows.first else {            return ASPresentationAnchor()        }        return window    }    @objc static func requiresMainQueueSetup() -> Bool { return true }}
```

### Paso 4: Implementar el módulo nativo de Android​

Agrega la dependencia a `android/app/build.gradle`:
```
implementation("androidx.browser:browser:1.5.0")
```

```
// android/app/src/main/java/<your.package>/UnicoModule.ktpackage com.yourappimport android.content.Intentimport android.net.Uriimport androidx.browser.customtabs.CustomTabsIntentimport com.facebook.react.bridge.*class UnicoModule(private val reactContext: ReactApplicationContext) :    ReactContextBaseJavaModule(reactContext) {    private var pendingPromise: Promise? = null    override fun getName() = "UnicoModule"    @ReactMethod    fun openSession(url: String, promise: Promise) {        pendingPromise = promise        currentActivity?.runOnUiThread {            CustomTabsIntent.Builder().build()                .launchUrl(currentActivity!!, Uri.parse(url))        } ?: promise.reject("NO_ACTIVITY", "No current activity")    }    fun handleRedirectUrl(uri: Uri) {        if (uri.scheme == "myapp") {            pendingPromise?.resolve(uri.toString())            pendingPromise = null        }    }}
```

```
// UnicoPackage.ktpackage com.yourappimport com.facebook.react.ReactPackageimport com.facebook.react.bridge.NativeModuleimport com.facebook.react.bridge.ReactApplicationContextimport com.facebook.react.uimanager.ViewManagerclass UnicoPackage : ReactPackage {    override fun createNativeModules(ctx: ReactApplicationContext): List<NativeModule> =        listOf(UnicoModule(ctx))    override fun createViewManagers(ctx: ReactApplicationContext): List<ViewManager<*, *>> =        emptyList()}
```

Registra en `MainApplication.kt`:
```
override fun getPackages(): List<ReactPackage> =    PackageList(this).packages.apply {        add(UnicoPackage())    }
```

Maneja las redirecciones en `MainActivity.kt`:
```
override fun onNewIntent(intent: Intent) {    super.onNewIntent(intent)    intent.data?.let { uri ->        if (uri.scheme == "myapp") {            val module = reactInstanceManager                .currentReactContext                ?.getNativeModule(UnicoModule::class.java)            module?.handleRedirectUrl(uri)        }    }}
```

### Paso 5: Configurar AndroidManifest.xml​

```
<uses-feature android:name="android.hardware.camera" android:required="false" /><uses-permission android:name="android.permission.CAMERA" /><activity android:name=".MainActivity" ...>    <intent-filter>        <action android:name="android.intent.action.VIEW" />        <category android:name="android.intent.category.DEFAULT" />        <category android:name="android.intent.category.BROWSABLE" />        <data android:scheme="myapp" android:host="callback" />    </intent-filter></activity>
```

### Paso 6: Iniciar la jornada​

```
import { Unico } from './modules/UnicoModule';const resultUrl = await Unico.openSession(processLink);// resultUrl = myapp://callback?id=...
```

### Resumen de archivos​

ArchivoPropósito`src/modules/UnicoModule.ts`Puente TypeScript`ios/UnicoModule.m`Declaración Objective-C`ios/UnicoModule.swift`iOS — ASWebAuthenticationSession`android/.../UnicoModule.kt`Android — Custom Tabs`android/.../UnicoPackage.kt`Registro de paquete`android/.../MainApplication.kt`Integración de paquete`android/.../MainActivity.kt`Manejo de URL de redirección`AndroidManifest.xml`Filtro de intentÚltima actualización el 21 oct 2026**