---
title: React Native
description: Intégrez le parcours Human Token dans votre application React Native — ASWebAuthenticationSession sur iOS et Custom Tabs sur Android via un module natif.
canonical: https://developer.unico.io/fr/human-token/integrations/app/react-native
locale: fr
generated_by: markdown-export
---

- [/fr/](/fr/)
- [Intégrations](/fr/human-token/integrations)
- Application
- React Native

**Sur cette pageReact NativeIntégrez le parcours Human Token dans votre application React Native via un module natif.

L'intégration utilise un module natif qui délègue à `ASWebAuthenticationSession` sur iOS et Custom Tabs sur Android. Lorsque le parcours est terminé, le module natif résout la promesse avec l'URL de callback.
### Prérequis​

React Native 0.71 ou ultérieur
Xcode 14+ pour iOS
Android Studio pour Android
Un schéma d'URL unique pour votre application (par ex. `myapp`)

### Étape 1 : Définir votre schéma d'URL​

Choisissez un schéma unique (par ex. `myapp`). Il est utilisé comme `callbackUri` lors de la création du processus :
```
callbackUri: myapp://callback
```

### Étape 2 : Créer le bridge 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),};
```

### Étape 3 : Implémenter le module natif 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 }}
```

### Étape 4 : Implémenter le module natif Android​

Ajoutez la dépendance à `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()}
```

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

Gérez les redirections dans `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)        }    }}
```

### Étape 5 : Configurer 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>
```

### Étape 6 : Lancer le parcours​

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

### Résumé des fichiers​

FichierObjectif`src/modules/UnicoModule.ts`Bridge TypeScript`ios/UnicoModule.m`Déclaration Objective-C`ios/UnicoModule.swift`iOS — ASWebAuthenticationSession`android/.../UnicoModule.kt`Android — Custom Tabs`android/.../UnicoPackage.kt`Enregistrement du package`android/.../MainApplication.kt`Intégration du package`android/.../MainActivity.kt`Gestion de l'URL de redirection`AndroidManifest.xml`Filtre d'intentDernière mise à jour le 21 oct. 2026**