الانتقال إلى المحتوى الرئيسي
الالتقاط على React Native

افتح الالتقاط من تطبيق React Native باستخدام وحدة أصلية.

Markdown

تنشئ الواجهة الخلفية لديك العملية في Human Plugin بتدفق Journey وcallbackUri يستخدم مخطط URL الخاص بتطبيقك. تفتح وحدة أصلية الرابط link من الاستجابة في ASWebAuthenticationSession على iOS وفي Custom Tabs على Android. عند انتهاء الالتقاط، تُنهي الوحدة وعدها (promise) ويستأنف التطبيق عمله.

احتفظ بـ id الخاص بـ Human Plugin من استجابة الإنشاء. ستقرأ الواجهة الخلفية لديك النتيجة به.

المتطلبات الأساسية​

  • React Native 0.71 أو أحدث
  • Xcode 14 أو أحدث لنظام iOS
  • Android Studio لنظام Android
  • مخطط URL فريد لتطبيقك، مثل myapp

1. أنشئ العملية بمخططك​

ترسل الواجهة الخلفية لديك المخطط بوصفه callbackUri:

{
"flow": "humantoken",
"clientId": "client-a",
"correlationId": "order-1001",
"credential": { "type": "DUI_TYPE_NG_BVN", "value": "<document number>" },
"callbackUri": "myapp://callback"
}

وتعيد id وlink إلى التطبيق.

2. أنشئ جسر TypeScript​

// src/modules/CaptureModule.ts
import { NativeModules } from 'react-native';

const { CaptureModule } = NativeModules;

if (!CaptureModule) {
throw new Error('CaptureModule not found. Make sure the native module is linked correctly.');
}

export const Capture = {
openSession: (url: string): Promise<string> => CaptureModule.openSession(url),
};

3. نفّذ وحدة iOS​

// ios/CaptureModule.m
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(CaptureModule, NSObject)
RCT_EXTERN_METHOD(openSession:(NSString *)url
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject)
@end

4. نفّذ وحدة Android​

أضف الاعتمادية إلى android/app/build.gradle:

implementation("androidx.browser:browser:1.5.0")
// android/app/src/main/java/<your.package>/CaptureModule.kt
package com.yourapp

import android.net.Uri
import androidx.browser.customtabs.CustomTabsIntent
import com.facebook.react.bridge.*

class CaptureModule(private val reactContext: ReactApplicationContext) :
ReactContextBaseJavaModule(reactContext) {

private var pendingPromise: Promise? = null

override fun getName() = "CaptureModule"

@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
}
}
}
// CapturePackage.kt
package com.yourapp

import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager

class CapturePackage : ReactPackage {
override fun createNativeModules(ctx: ReactApplicationContext): List<NativeModule> =
listOf(CaptureModule(ctx))
override fun createViewManagers(ctx: ReactApplicationContext): List<ViewManager<*, *>> =
emptyList()
}

سجّلها في MainApplication.kt:

override fun getPackages(): List<ReactPackage> =
PackageList(this).packages.apply {
add(CapturePackage())
}

عالج العودة في MainActivity.kt:

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
intent.data?.let { uri ->
if (uri.scheme == "myapp") {
val module = reactInstanceManager
.currentReactContext
?.getNativeModule(CaptureModule::class.java)
module?.handleRedirectUrl(uri)
}
}
}

5. سجّل مخططك على Android​

في 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 { Capture } from './modules/CaptureModule';

try {
await Capture.openSession(link);
// انتهى الالتقاط. اطلب من الواجهة الخلفية لديك قراءة النتيجة
// عبر GET /v1/processes/{id}، باستخدام id الخاص بـ Human Plugin.
} catch {
// أغلق الشخص الجلسة.
}

الملخص​

الملفالغرض
src/modules/CaptureModule.tsجسر TypeScript
ios/CaptureModule.mإعلان Objective-C
ios/CaptureModule.swiftiOS: ASWebAuthenticationSession
android/.../CaptureModule.ktAndroid: Custom Tabs
android/.../CapturePackage.ktتسجيل الحزمة
android/.../MainApplication.ktيضيف الحزمة
android/.../MainActivity.ktيعالج العودة
AndroidManifest.xmlمرشّح intent