---
title: React Native
description: 将 Human Token Journey 集成到您的 React Native 应用中 — iOS 上使用 ASWebAuthenticationSession，Android 上通过原生模块使用 Custom Tabs。
canonical: https://developer.unico.io/zh-CN/human-token/integrations/app/react-native
locale: zh-CN
generated_by: markdown-export
---

- [/zh-CN/](/zh-CN/)
- [集成](/zh-CN/human-token/integrations)
- 应用
- React Native

**本页内容React Native通过原生模块将 Human Token Journey 集成到您的 React Native 应用中。

集成使用原生模块，在 iOS 上委托给 `ASWebAuthenticationSession`，在 Android 上委托给 Custom Tabs。当旅程完成时，原生模块使用回调 URL 解析 Promise。
### 前提条件​

React Native 0.71 或  更高版本
用于 iOS 的 Xcode 14+
用于 Android 的 Android Studio
您应用的唯一 URL scheme（例如 `myapp`）

### 步骤 1：定义 URL scheme​

选择一个唯一的 scheme（例如 `myapp`）。创建流程时将其用作 `callbackUri`：
```
callbackUri: myapp://callback
```

### 步骤 2：创建 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),};
```

### 步骤 3：实现 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 }}
```

### 步骤 4：实现 Android 原生模块​

将依赖添加到 `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()}
```

在 `MainApplication.kt` 中注册：
```
override fun getPackages(): List<ReactPackage> =    PackageList(this).packages.apply {        add(UnicoPackage())    }
```

在 `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)        }    }}
```

### 步骤 5：配置 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>
```

### 步骤 6：启动旅程​

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

### 文件概览​

文件用途`src/modules/UnicoModule.ts`TypeScript 桥接`ios/UnicoModule.m`Objective-C 声明`ios/UnicoModule.swift`iOS — ASWebAuthenticationSession`android/.../UnicoModule.kt`Android — Custom Tabs`android/.../UnicoPackage.kt`包注册`android/.../MainApplication.kt`包集成`android/.../MainActivity.kt`重定向 URL 处理`AndroidManifest.xml`Intent 过滤器最后更新 于 2026年10月21日**