---
title: React Native
description: React NativeアプリにHuman Token Journeyを統合します — iOSではASWebAuthenticationSession、AndroidではCustom Tabsをネイティブモジュール経由で使用。
canonical: https://developer.unico.io/ja/human-token/integrations/app/react-native
locale: ja
generated_by: markdown-export
---

- [/ja/](/ja/)
- [統合](/ja/human-token/integrations)
- アプリ
- React Native

**このページの内容React Nativeネイティブモジュール経由でReact NativeアプリにHuman Token Journeyを統合します。

この統合は、iOSでは`ASWebAuthenticationSession`、AndroidではCustom Tabsに委譲するネイティブモジュールを使用します。ジャーニーが完了すると、ネイティブモジュールがコールバックURLでPromiseを解決します。
### 前提条件​

React Native 0.71以降
iOS向けXcode 14+
Android向けAndroid Studio
アプリ固有のURLスキーム（例：`myapp`）

### ステップ 1：URLスキームを定義する​

一意のスキームを選択します（例：`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日**に