@didit-protocol/sdk-react-native

中文文档
4.14.7发布于 2026/11/11MITTypeScriptESM + CJS零依赖构建来源已验证近 30 天下载 7.8万

Didit 身份验证 SDK 的原生包装

中文使用文档
文档目录43 节
  1. 所需资源
  2. 平台要求
  3. 权限
  4. iOS系统
  5. 机器人
  6. 银行和地点核查步骤
  7. 银行
  8. IOS 上的位置
  9. Android 上的位置( 地址 )
  10. 原生 SDK 变体
  11. 安装
  12. 博览
  13. 反应原生 CLI
  14. 快速启动
  15. 选项A:以会话符号开始校验
  16. 备选案文B:以工作流程ID开始核查
  17. 配置
  18. 配置选项
  19. languageCode
  20. showLanguageSelector
  21. fontFamily
  22. loggingEnabled
  23. 相机设置
  24. 语言设置
  25. 高级会话参数
  26. 完整工作流程示例
  27. 核查结果
  28. 结果类型
  29. 会话数据
  30. 校验错误
  31. 错误类型
  32. 处理结果
  33. 完整示例
  34. API 参考
  35. startVerification(token, config?)
  36. startVerificationWithWorkflow(workflowId, options?)
  37. submitTransaction(transactionToken, transaction, options?)
  38. getTransaction(transactionToken, transactionId, options?)
  39. 导出类型
  40. 运行示例应用程序
  41. iOS系统
  42. 机器人
  43. 许可证

本地反应的 DiditSDK

用于 Didit 身份验证 SDK 的回放原生包装. 支持iOS和Android同时使用在React Industrial's New Architecture(Turbo Modules)上所构建的统一TypeScript API.

正在准备作为单独的 @didit-protocol/auth-react-native 软件包. 在本地的DiditAuth人融入之前,这是私人的,无法使用.

所需资源

  • 反应原生 0.76+ (新建筑 / TurboModules)
  • 节点.js 20+
  • 类型脚本 5+

平台要求

平台最小版本页:1
iOS系统13.0+ (韩语)NFC护照读取需要iOS 15.0+
机器人API 24+ (7.0) (中文(简体) )Kotlin 2.1.10+, Android Gradle插件 8.6.0+, Gradle 8.7+, JDK 17

权限

SDK只为位置验证步骤使用相机,可选为 NFC 和位置(参见 银行和地点核查步骤) (中文(简体) ). 原生许可由基础原生SDK宣布,并在平台支持的地方自动合并.

iOS系统

在您的应用程序中添加以下密钥 Info.plist数字 :

<key>NSCameraUsageDescription</key>
<string>Camera access is required to scan your identity documents for verification.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required to record video for liveness verification.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Photo library access is required to upload document images.</string>
<key>NFCReaderUsageDescription</key>
<string>NFC is used to read passport chip data for identity verification.</string>

缺少需要的iOS隐私密钥会让iOS在SDK访问保护资源后立即终止应用.

NFC 配置(用于读取护照/ID芯片)

  1. 添加 NFC 能力 在 Xcode 中:

    • 选择目标 > 签名( C) > + 能力 > 接近外地通讯标记读取
  2. 添加 ISO7816 标识符 改为 Info.plist数字 :

    <key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
    <array>
        <string>D23300000045737445494420763335</string>
        <string>A0000002471001</string>
        <string>A0000002472001</string>
        <string>00000000000000</string>
    </array>
    
  3. 添加应享权利文件 启用 NFC 标签读取 :

    <key>com.apple.developer.nfc.readersession.formats</key>
    <array>
        <string>TAG</string>
    </array>
    

确保应用程序的提供配置包括NFC标签阅读能力. NFC被禁用时不需要这种NFC配置.

机器人

以下权限在本地 SDK 中声明 AndroidManifest.xml 并自动合并 :

权限说明
INTERNETAPI 通信的网络访问
ACCESS_NETWORK_STATE检测网络可用性
CAMERA文件扫描和面相验证
NFC在护照/身份证上读取 NFC 芯片

相机和NFC硬件特性被宣布为可选(android:required="false"),因此你的应用程序可以安装在没有这些特性的设备上.

运行时间权限

SDK自动处理Android运行时权限请求. 当用户到达需要相机访问的一步时:

  1. SDK 提示, 如果尚未获得相机许可
  2. 如果用户 否认 中,使用“再次尝试”按钮显示错误消息
  3. 如果用户 赠款 权限, 核查流量继续

您在拨打前不需要在您的应用代码中请求相机许可 startVerification() - SDK内部管理这个.

银行和地点核查步骤

工作流量可包括: 银行 步骤(个人链接银行账户)和a 地点 步骤(设备位置读取一次,并征得个人同意)。 两个屏幕都由本地的 SDK 绘制, 所以这个软件包不需要新的 API: 它们运行在内部 startVerification() 编号 : startVerificationWithWorkflow(),结果还是一样 VerificationResult。 。 。 .

银行

没有设置。 本地SDK在系统浏览器中打开了银行的页面(或一页Didit主机),因此没有权限,URL计划或深层链接来注册.

IOS 上的位置

船舶在本地SDK中的位置完整 位置变体,而不是作为附加: Core-Location, (中文(简体) ), NFC-Location 财务报告和审定财务报表 All-Location 对于可可花, DiditSDKCoreLocation, (中文(简体) ), DiditSDKNFCLocation 财务报告和审定财务报表 DiditSDKLocation (所有与位置) SwiftPM。 完全可以宣布一个 DiditSDK 变体,所以这个包从您的变体中选择给你: all 地图到 All-Location, (中文(简体) ), core 财务报告和审定财务报表 autodetection 地图到 Core-Location, (中文(简体) ), nfc 地图到 NFC-Location。 。 。 .

设定 $DiditSdkIosLocationEnabled = true 在此之前 use_native_modules! (或 DIDIT_SDK_IOS_LOCATION_ENABLED=true)并保留一个单曲 pod didit_sdk_subspec 线条显示于 反应原生 CLI与位置映射。 使用 SwiftPM 链接时, 同一旗子会选择位置产品, 并且不需要主干线 。 展览用户设置 iosLocationEnabled: true 在此套件的插件选项中运行预建。 不启用位置, 或不启用 NSLocationWhenInUseUsageDescription,该步骤没有显示即时性,报告设备不能放置人物,工作流程自己的规则决定.

添加目的字符串到 Info.plist。 。 。 . NSLocationTemporaryUsageDescriptionDictionary 是可选的:它允许步骤在只授予一个近似位置(iOS 14+)时要求精确位置一次,其密钥必须是准确的 DiditLocationVerification。 。 。 .

<key>NSLocationWhenInUseUsageDescription</key>
<string>Your location is used to confirm where you are for this verification.</string>
<key>NSLocationTemporaryUsageDescriptionDictionary</key>
<dict>
    <key>DiditLocationVerification</key>
    <string>This verification needs your precise location once.</string>
</dict>

iOS通过设备语言来选择这些字符串,而不是SDK的 languageCode,所以翻译在每一个中 <lang>.lproj/InfoPlist.strings。精确位置字符串在其目的键下翻译。 举个例子 es.lproj/InfoPlist.strings数字 :

"NSLocationWhenInUseUsageDescription" = "Tu ubicación se usa para confirmar dónde estás en esta verificación.";
"DiditLocationVerification" = "Esta verificación necesita tu ubicación precisa una vez.";

将相同的密钥设置在 Expo 中 app.json 并翻译为: locales数字 :

{
  "expo": {
    "plugins": [
      ["@didit-protocol/sdk-react-native", { "iosLocationEnabled": true }]
    ],
    "ios": {
      "infoPlist": {
        "NSLocationWhenInUseUsageDescription": "Your location is used to confirm where you are for this verification.",
        "NSLocationTemporaryUsageDescriptionDictionary": {
          "DiditLocationVerification": "This verification needs your precise location once."
        }
      }
    },
    "locales": {
      "es": "./locales/es.json"
    }
  }
}

地点 locales/es.json 为:

{
  "ios": {
    "NSLocationWhenInUseUsageDescription": "Tu ubicación se usa para confirmar dónde estás en esta verificación.",
    "DiditLocationVerification": "Esta verificación necesita tu ubicación precisa una vez."
  }
}

此寄存器中的两个示例应用程序都用英语和西班牙语声明这些字符串.

一旦您的应用程序链接模块, 请声明 准确位置 财务报告和审定财务报表 粗细位置 在 App Store 连接中 App 函数,链接到用户而不用于跟踪。 SDK每次尝试读取一个位置,只在台阶被屏幕显示时,才从背景中读取.

Android 上的位置( 地址 )

本地 SDK 声明 ACCESS_FINE_LOCATION 财务报告和审定财务报表 ACCESS_COARSE_LOCATION,加上位置硬件特性作为可选性(android:required="false"),它们自动地合并到您的应用中. 只有在一个工作流程到达台阶时,经过一个解释原因的屏幕之后,才能在运行时间提出这些要求,而且此人可以给出准确或大致的位置。 如果你的应用程序从未运行该步骤,你可以把它们从合并清单中删除 <manifest> 要素需求 xmlns:tools="http://schemas.android.com/tools":

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove" />

仍然达到该步骤的会话,然后报告该位置不可用,而不迅速。 如果你留着,就宣布 大约位置 财务报告和审定财务报表 准确位置 在您的 Google 游戏数据安全表中收集的数据.

原生 SDK 变体

NFC默认在两个平台上启用. 每个变体都有自动抓取功能.

React Natural插件可以安装被iOS和Android SDK所曝光的同一种原生SDK变体:

备选案文NFC 护照读取使用时间
all对您想要完整的 SDK( 默认)
core没有您不需要 NFC 护照读取
nfc对你想要NFC变体
autodetection没有折旧:与 core

当NFC被禁用时,你不需要iOS NFC能力,NFC应享权利,Android NFC包装规则,或NFC相关的提供设置.

安装

博览

npx expo install @didit-protocol/sdk-react-native

然后将配置插件添加到您的 app.json (或 app.config.js) (中文(简体) ). 默认的本地变体是 all数字 :

{
  "expo": {
    "plugins": ["@didit-protocol/sdk-react-native"]
  }
}

要选择较小的本地变体 :

{
  "expo": {
    "plugins": [
      [
        "@didit-protocol/sdk-react-native",
        {
          "iosVariant": "core",
          "androidVariant": "core"
        }
      ]
    ]
  }
}

就是这样。 插件自动配置两个平台 :

  • 机器人: 将 Didit Maven 寄存器添加到 Gradle 并写入 diditSdkAndroidVariant
  • iOS: (英语) 将 DiditSDK 的 podspec 添加到 Pod 文件并设定 $DiditSdkIosVariant

支助 iosVariant 编号 : androidVariant 值为 all, (中文(简体) ), core, (中文(简体) ), autodetection,以及 nfc遗产布林斯iosNfcEnabled, (中文(简体) ), iosAutoDetectionEnabled, (中文(简体) ), androidNfcEnabled仍然工作,不过 iosVariant 编号 : androidVariant 倾向于采用新的整合.

过 "iosLinkage": "spm" 要通过 Swift 软件包管理器而不是 CocoaPods 解决本地 iOS SDK - 此插件会写出否 pod 'DiditSDK' 线条。 见 Swift 软件包管理器 提醒你一下,我说... 默认是 cocoapods。 。 。 .

IOS postspec URL 来源于本软件包的 SDK 版本 (diditNativeSdkVersions.ios 联合国 package.json因此,它总是匹配 DiditSDK 版本的 post spec 取决于 。 用叉子、镜子或预先释放标记指向可可花,通过 iosPodspecUrl数字 :

[
  "@didit-protocol/sdk-react-native",
  {
    "iosPodspecUrl": "https://raw.githubusercontent.com/didit-protocol/sdk-ios/4.14.7/DiditSDK.podspec"
  }
]

说明: 此 SDK 使用 Expo Go 不可用的本地模块(相机, NFC). 你必须用一个 发展 运行 npx expo prebuild 开发本地项目.

反应原生 CLI

npm install @didit-protocol/sdk-react-native
# or
yarn add @didit-protocol/sdk-react-native

iOS系统

将 DiditSDK 显示器添加到您的 Podfile (不在可可花树干上) 默认的本地变体是 all数字 :

# Pick one: 'all', 'core', 'nfc' ('autodetection' is deprecated and identical to 'core')
$DiditSdkIosVariant = 'all'

def max_ios_version(*versions)
  versions.map(&:to_s).max_by { |version| Gem::Version.new(version) }
end

didit_sdk_ios_deployment_target = ['all', 'nfc'].include?($DiditSdkIosVariant) ? max_ios_version(min_ios_version_supported, '15.0') : min_ios_version_supported
platform :ios, didit_sdk_ios_deployment_target

# Inside your app target:
# Location ships as complete variants (All-Location, Core-Location, NFC-Location)
$DiditSdkIosLocationEnabled = false # true to enable the Location step
didit_sdk_location_suffix = $DiditSdkIosLocationEnabled ? '-Location' : ''
didit_sdk_subspec = case $DiditSdkIosVariant
                    when 'all'           then "DiditSDK/All#{didit_sdk_location_suffix}"
                    when 'core', 'autodetection' then "DiditSDK/Core#{didit_sdk_location_suffix}"
                    when 'nfc'           then "DiditSDK/NFC#{didit_sdk_location_suffix}"
                    else
                      raise "Invalid $DiditSdkIosVariant '#{$DiditSdkIosVariant}'. Supported values: all, core, autodetection, nfc."
                    end
pod didit_sdk_subspec, :podspec => 'https://raw.githubusercontent.com/didit-protocol/sdk-ios/4.14.7/DiditSDK.podspec'
Swift 软件包管理器( 可选)

在本地 0.75+ 中, 您可以跳过 pod 并让 SwiftPM 直接从 sdk-ios 复发. 设定链接, 而不是声明主机 :

# Pick one: 'all', 'core', 'autodetection', 'nfc'
$DiditSdkIosVariant = 'all'
$DiditSdkIosLinkage = 'spm'

def max_ios_version(*versions)
  versions.map(&:to_s).max_by { |version| Gem::Version.new(version) }
end

didit_sdk_ios_deployment_target = ['all', 'nfc'].include?($DiditSdkIosVariant) ? max_ios_version(min_ios_version_supported, '15.0') : min_ios_version_supported
platform :ios, didit_sdk_ios_deployment_target

# No `pod 'DiditSDK'` line needed - SdkReactNative.podspec declares it as a
# SwiftPM dependency on the matching sdk-ios tag.

DIDIT_SDK_IOS_LINKAGE=spm 也行,博览会用户可以通过 "iosLinkage": "spm" 到配置插件. cocoapods 仍然是默认.

如果您将已有工程切换到 spm, (中文(简体) ), 删除 pod didit_sdk_subspec, :podspec => ... 线条 - 将两个框架连接两次。 React Industrial警告说,SwiftPM包与静态连接的吊舱结合,可以产生链接器出错;如果击中这些,则用 USE_FRAMEWORKS=dynamic (单位:千美元)细节) (中文(简体) ).

然后安装依赖性 :

cd ios
bundle exec pod install

要切换变体, 干净的可可Pods 首先, 所以前一个变体不重复使用 :

cd ios
rm -rf Pods Podfile.lock

# Edit $DiditSdkIosVariant in your Podfile, then:
bundle exec pod install

机器人

添加 Didit Maven 寄存器到您的工程级别 settings.gradle数字 :

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven {
            url "https://raw.githubusercontent.com/didit-protocol/sdk-android/main/repository"
            // Scope to Didit's group: unfiltered, Gradle probes this host for
            // every dependency and a 429 disables the repo mid-build (issue #40).
            content { includeGroup "me.didit" }
        }
        maven { url "https://jitpack.io" }
    }
}

默认情况下, React 本地插件依赖于完整的Android SDK(all) (中文(简体) ). 要选择另一个变体,请添加到 android/gradle.properties数字 :

diditSdkAndroidVariant=core

支持的值为 all, (中文(简体) ), core, (中文(简体) ), autodetection,以及 nfc遗产 diditSdkAndroidNfcEnabled=false 属性仍然映射到 core 用于后向兼容,但 diditSdkAndroidVariant 选择新的整合.

两个平台的原生SDK依赖性在库中宣告并自动解决.

快速启动

选项A:以会话符号开始校验

如果您的后端创建了校验会话并返回一个符号:

import { startVerification, VerificationStatus } from '@didit-protocol/sdk-react-native';

const result = await startVerification('your-session-token');

switch (result.type) {
  case 'completed':
    console.log('Status:', result.session.status);
    console.log('Session ID:', result.session.sessionId);
    break;
  case 'cancelled':
    console.log('User cancelled');
    break;
  case 'failed':
    console.log('Error:', result.error.type, result.error.message);
    break;
}

备选案文B:以工作流程ID开始核查

如果您想要 SDK 使用工作流程ID创建会话 :

import { startVerificationWithWorkflow } from '@didit-protocol/sdk-react-native';

const result = await startVerificationWithWorkflow('your-workflow-id', {
  vendorData: 'user-123',
  config: { loggingEnabled: true },
});

配置

两者 startVerification 财务报告和审定财务报表 startVerificationWithWorkflow 接受一个 DiditConfig 对象自定义 SDK 行为。 对于 startVerification,通过它作为第二个论点。 对于 startVerificationWithWorkflow传入里面 options.config 字段.

import { startVerification } from '@didit-protocol/sdk-react-native';

// With startVerification — config is the second argument
const result = await startVerification('your-session-token', {
  languageCode: 'es',
  showLanguageSelector: true,
  fontFamily: 'Avenir',
  loggingEnabled: true,
  showCloseButton: true,
  showExitConfirmation: true,
  closeOnComplete: false,
});

// With startVerificationWithWorkflow — config is inside options
const result = await startVerificationWithWorkflow('your-workflow-id', {
  vendorData: 'user-123',
  config: {
    languageCode: 'es',
    showLanguageSelector: true,
    loggingEnabled: true,
    showCloseButton: true,
    showExitConfirmation: true,
  },
});

配置选项

选项类型默认说明
languageCodestring设备定位ISO 639-1语言代码(例如. "en", (中文(简体) ), "fr", (中文(简体) ), "ar"(中文(简体) )
showLanguageSelectorbooleanfalse在欢迎屏幕上显示网络风格的语言选择器
fontFamilystring系统字体自定义字体姓氏
loggingEnabledbooleanfalse启用 SDK 调试记录
showCloseButtonbooleantrue在校验步骤屏幕上显示关闭( X) 按钮
showExitConfirmationbooleantrue用户试图退出时显示确认对话框
closeOnCompletebooleanfalse完成时自动解除校验
defaultDocumentCameraCameraLens本地默认( N)back(中文(简体) )第一次进入文档抓取屏幕时使用的镜头
defaultLivenessCameraCameraLens本地默认( N)front(中文(简体) )第一次进入活性(被动面)抓取屏幕时使用的镜头
showDocumentCameraSwitchButtonbooleantrue在文档屏幕上显示抓取相机切换器
showLivenessCameraSwitchButtonbooleantrue在活性屏幕上显示抓取相机切换器

所有字段都是可选的. 如果不提供配置, SDK 会使用合理的默认值 .

languageCode

设置整个验证 UI 的语言。 通过一个ISO 639-1代码(例如. "en", (中文(简体) ), "fr", (中文(简体) ), "es", (中文(简体) ), "ar") (中文(简体) ). 如果不设定,SDK会自动检测设备的地盘并倒回英语.

// Force French
await startVerification(token, { languageCode: 'fr' });

// Use device locale (default — no config needed)
await startVerification(token);

showLanguageSelector

设定为 true 来让用户从欢迎屏幕中更改校验语言。 选择器默认隐藏 .

await startVerification(token, { showLanguageSelector: true });

fontFamily

覆盖整个SDK UI所使用的字体. 该字体必须在您的应用程序的本地配置中注册 :

  • iOS: (英语) 将字体文件添加到您的 Xcode 工程中并列出其中 Info.plist 下级 UIAppFonts。 。 。 .
  • 机器人: 将字体文件放入 android/app/src/main/res/font/。 。 。 .
await startVerification(token, { fontFamily: 'Avenir' });

如果不设定,SDK会使用平台的默认系统字体.

loggingEnabled

启用本地 SDK 调试日志 。 开发期间用于检查SDK的内部状态,API调用,以及出错细节. 应在生产中被禁用.

// Enable logging for debugging
await startVerification(token, { loggingEnabled: true });

相机设置

控制文档默认打开的相机镜头和活性捕捉屏幕,以及是否向用户显示摄入相机切换器.

import { CameraLens, startVerification } from '@didit-protocol/sdk-react-native';

await startVerification(token, {
  defaultDocumentCamera: CameraLens.Back, // back is the native default
  defaultLivenessCamera: CameraLens.Front, // front is the native default
  showDocumentCameraSwitchButton: true, // false to lock to the chosen lens
  showLivenessCameraSwitchButton: true,
});

如果设备上没有所请求的镜头,则原生的SDK会倒回第一台可用的相机,因此捕获仍然有效. 切换器也自动隐藏在单相机设备上,而不论 show…SwitchButton 旗帜.

语言设置

SDK支持54种语言. 如果没有指定语言,SDK则使用有英语的器件locale作为倒置.

// Use device locale (default)
await startVerification(token);

// Force a specific language
await startVerification(token, { languageCode: 'fr' });

支持的语言

语言代码语言代码
阿尔巴尼亚语Namesq哈萨克语Namekk
阿拉伯语ar韩文ko
亚美尼亚语Namehy吉尔吉斯ky
孟加拉语bn拉脱维亚语Namelv
波斯尼亚语bs立陶宛语Namelt
保加利亚语Namebg马其顿mk
加泰罗尼亚语Nameca马来语Namems
中文zh黑山cnr
汉语 (简化)zh-CN挪威语no
中文( 传统)zh-TW波斯语Namefa
克罗地亚hr波兰语Namepl
捷克语cs葡萄牙语pt
丹麦语Nameda葡萄牙语( 巴西)pt-BR
荷兰语Namenl罗马尼亚语Namero
联合国en俄语ru
爱沙尼亚语et塞尔维亚语sr
芬兰语fi斯洛伐克语sk
法语fr斯洛文尼亚语Namesl
格鲁吉亚语Nameka索马里so
德语de西班牙语es
希腊语Nameel瑞典语sv
希伯来语Namehe泰国语Nameth
印地语hi土耳其语Nametr
匈牙利语Namehu乌克兰语Nameuk
印度尼西亚语Nameid乌兹别克斯坦语Nameuz
意大利语it越南语Namevi
日本语ja蒙古语mn

高级会话参数

对于高级会话参数,例如: contact_details, (中文(简体) ), expected_details, (中文(简体) ), metadata,以及 callback,使用 后端会话 方法。 你的后端电话 POST /v3/会话/会话 然后通过 session_token 给SDK:

// Your backend creates the session with advanced parameters:
// POST /v3/session/ with contact_details, expected_details, metadata, etc.
// Then passes the session_token to the SDK:
const result = await startVerification(sessionTokenFromBackend);

说明: 这个 startVerificationWithWorkflow 仅支持方法 vendorData。对于任何其他会话参数,请使用后端会话方法.

完整工作流程示例

const result = await startVerificationWithWorkflow('your-workflow-id', {
  vendorData: 'user-123',
  config: {
    languageCode: 'en',
    loggingEnabled: true,
    showCloseButton: true,
    showExitConfirmation: true,
  },
});

核查结果

两者 startVerification 财务报告和审定财务报表 startVerificationWithWorkflow 返回 a Promise<VerificationResult>其结果是存在歧视的工会——使用 type 字段来决定结果.

结果类型

类型说明字段
completed核查流程完成session (永远存在)
cancelled用户取消了流量session (可选)
failed发生了错误error (总是在), session (可选)

会话数据

财产类型说明
sessionIdstring唯一会话标识符
statusVerificationStatusApproved, (中文(简体) ), Pending,或 Declined

校验错误

财产类型说明
typeVerificationErrorType错误类别(见下表)
messagestring可读错误描述

错误类型

错误类型说明
sessionExpired会话已过期
networkError网络连接问题
cameraAccessDenied未获得相机许可
notInitializedSDK 未初始化( 只有Android)
apiErrorAPI 请求失败
retryBlocked先前的核查未获核准并达到最高复试次数
unknown信件中的其他错误

处理结果

import {
  startVerification,
  VerificationStatus,
  type VerificationResult,
} from '@didit-protocol/sdk-react-native';

async function verify(token: string) {
  const result: VerificationResult = await startVerification(token);

  switch (result.type) {
    case 'completed':
      switch (result.session.status) {
        case VerificationStatus.Approved:
          console.log('Identity verified!');
          break;
        case VerificationStatus.Pending:
          console.log('Verification under review.');
          break;
        case VerificationStatus.Declined:
          console.log('Verification declined.');
          break;
      }
      console.log('Session ID:', result.session.sessionId);
      break;

    case 'cancelled':
      console.log('User cancelled the verification.');
      if (result.session) {
        console.log('Session ID:', result.session.sessionId);
      }
      break;

    case 'failed':
      console.log(`Error [${result.error.type}]: ${result.error.message}`);
      break;
  }
}

完整示例

import { useState, useCallback } from 'react';
import {
  Text,
  View,
  TextInput,
  TouchableOpacity,
  Alert,
  ActivityIndicator,
  SafeAreaView,
} from 'react-native';
import {
  startVerification,
  startVerificationWithWorkflow,
  VerificationStatus,
  type VerificationResult,
} from '@didit-protocol/sdk-react-native';

export default function App() {
  const [token, setToken] = useState('');
  const [loading, setLoading] = useState(false);

  const handleVerify = useCallback(async () => {
    if (!token.trim()) {
      Alert.alert('Error', 'Please enter a session token.');
      return;
    }

    setLoading(true);
    try {
      const result = await startVerification(token.trim(), {
        loggingEnabled: true,
      });
      showResult(result);
    } catch (error) {
      Alert.alert('Error', `Unexpected error: ${error}`);
    } finally {
      setLoading(false);
    }
  }, [token]);

  const showResult = (result: VerificationResult) => {
    switch (result.type) {
      case 'completed':
        Alert.alert(
          'Verification Complete',
          `Status: ${result.session.status}\nSession: ${result.session.sessionId}`
        );
        break;
      case 'cancelled':
        Alert.alert('Cancelled', 'The user cancelled the verification.');
        break;
      case 'failed':
        Alert.alert('Failed', `${result.error.type}: ${result.error.message}`);
        break;
    }
  };

  return (
    <SafeAreaView style={{ flex: 1, padding: 24, justifyContent: 'center' }}>
      <TextInput
        placeholder="Enter session token..."
        value={token}
        onChangeText={setToken}
        autoCapitalize="none"
        style={{
          borderWidth: 1,
          borderColor: '#ccc',
          borderRadius: 8,
          padding: 12,
          marginBottom: 16,
        }}
      />
      <TouchableOpacity
        onPress={handleVerify}
        disabled={loading}
        style={{
          backgroundColor: '#1a1a1a',
          borderRadius: 8,
          padding: 16,
          alignItems: 'center',
        }}
      >
        {loading ? (
          <ActivityIndicator color="#fff" />
        ) : (
          <Text style={{ color: '#fff', fontWeight: '600' }}>
            Start Verification
          </Text>
        )}
      </TouchableOpacity>
    </SafeAreaView>
  );
}

API 参考

startVerification(token, config?)

以现有的会话符号开始校验 .

参数类型需求说明
tokenstring对来自 Didit API 的会话令牌
configDiditConfig没有SDK 配置选项

回返情况: Promise<VerificationResult>

startVerificationWithWorkflow(workflowId, options?)

通过创建一个带有工作流程ID的新会话开始校验.

参数类型需求说明
workflowIdstring对定义验证步骤的工作流程 ID
optionsWorkflowOptions没有工作流程备选方案(见下文)

回返情况: Promise<VerificationResult>

工作流程选项

外地类型说明
vendorDatastring您的用户标识符或引用
configDiditConfigSDK 配置选项

说明: 高级会话参数(contactDetails, (中文(简体) ), expectedDetails, (中文(简体) ), metadata),使用后端会话方法(startVerification 通过 POST /v3/ session/ 创建一个令牌.

submitTransaction(transactionToken, transaction, options?)

从设备直接提交交易 。 需要由您的后端通过 : POST /v3/transactions/sdk-token/。设备智能自动附加. autoLaunchAction (默认) true(a) 自动发射 wallet_ownership 本土行动,援引 options.onTransactionUpdated 完成后; a verification_session 动作从不自动发射,总是返回 result.actionRequired 您的应用程序将启动自己的 Didit 验证集成。 全向导 : SDK 交易提交。 。 。 .

参数类型需求说明
transactionTokenstring对交易 SDK 令牌( 同意为 X-Transaction-Token(中文(简体) )
transactionDiditTransaction对交易有效载荷txnId 需要; info, (中文(简体) ), subject, (中文(简体) ), counterparty, (中文(简体) ), travelRule, (...) (中文(简体) )
optionsDiditTransactionOptions没有baseUrl, (中文(简体) ), autoLaunchAction (默认) true, (中文(简体) ), onTransactionUpdated 回调

回返情况: Promise<DiditTransactionResult> 与 transactionId, (中文(简体) ), status, (中文(简体) ), travelRuleStatus?,以及 actionRequired?。 。 。 .

掷出 : DiditTransactionError 与 code 设置为 invalid_token, (中文(简体) ), expired_token, (中文(简体) ), validation (见 fieldErrors),或 network。 。 。 .

import { submitTransaction, DiditTransactionError } from '@didit-protocol/sdk-react-native';

try {
  const result = await submitTransaction(sdkToken, {
    txnId: 'order-123',
    type: 'crypto',
    info: { direction: 'outbound', amount: 0.25, currency: 'ETH' },
    travelRule: { required: true },
  }, {
    onTransactionUpdated: (updated) => console.log('Refreshed:', updated.status),
  });
  console.log(result.transactionId, result.actionRequired?.type);
} catch (error) {
  if (error instanceof DiditTransactionError) {
    console.log(error.code, error.fieldErrors);
  }
}

A 类 verification_session 动作返回,而不是自动发射 - 自行发射 startVerification数字 :

import { submitTransaction, startVerification } from '@didit-protocol/sdk-react-native';

const result = await submitTransaction(sdkToken, transaction);

if (result.actionRequired?.type === 'verification_session') {
  const { sessionToken } = result.actionRequired;
  const verification = await startVerification(sessionToken!);
  console.log('Verification result:', verification.type);
}

getTransaction(transactionToken, transactionId, options?)

获取先前以相同符号提交的交易的当前状态 .

参数类型需求说明
transactionTokenstring对交易 SDK 令牌
transactionIdstring对transactionId 返回时间 submitTransaction
optionsDiditTransactionOptions没有baseUrl 覆盖

回返情况: Promise<DiditTransactionResult>

导出类型

import {
  // Functions
  startVerification,
  startVerificationWithWorkflow,
  submitTransaction,
  getTransaction,

  // Enum
  VerificationStatus,

  // Classes
  DiditTransactionError,

  // Types
  type VerificationResult,
  type VerificationCompleted,
  type VerificationCancelled,
  type VerificationFailed,
  type VerificationError,
  type VerificationErrorType,
  type SessionData,
  type DiditConfig,
  type ContactDetails,
  type ExpectedDetails,
  type WorkflowOptions,
  type DiditTransaction,
  type DiditTransactionInfo,
  type DiditTransactionParticipant,
  type DiditTransactionPaymentMethod,
  type DiditTravelRule,
  type DiditTransactionActionRequired,
  type DiditTransactionResult,
  type DiditTransactionOptions,
  type DiditTransactionErrorCode,
} from '@didit-protocol/sdk-react-native';

运行示例应用程序

该寄存器包括一个功能完备的示例应用.

iOS系统

yarn install
cd example/ios && bundle exec pod install && cd ../..
yarn run:ios

要运行在真正的设备上,打开 example/ios/SdkReactNativeExample.xcworkspace 在 Xcode 中,配置您的签名团队,并选择您的设备.

机器人

yarn install
yarn run:android

许可证

版权 (c) 2026 Didit. 版权所有.

版本与发布记录

@didit-protocol/sdk-react-native 共发布 66 个版本,首次发布于 2026/02/17;过去 12 个月发布了 66 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
4.14.7latest2026/11/11今天
4.14.62026/11/11今天
4.14.52026/11/111 天前
4.14.42026/11/111 天前
4.14.32026/11/101 天前
4.14.22026/11/101 天前

关于 @didit-protocol/sdk-react-native 的常见问题

@didit-protocol/sdk-react-native 是什么?

Didit 身份验证 SDK 的原生包装

如何安装 @didit-protocol/sdk-react-native?

在项目目录运行 npm install @didit-protocol/sdk-react-native,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(*)、react-native(*)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@didit-protocol/sdk-react-native 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@didit-protocol/sdk-react-native 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@didit-protocol/sdk-react-native 可以商用吗?

@didit-protocol/sdk-react-native 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@didit-protocol/sdk-react-native 的下载量有多少?

根据 npm 官方下载统计,@didit-protocol/sdk-react-native 在 2026/10/12 – 2026/11/10 这 30 天内被下载 77,890 次,日均约 2,596 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@didit-protocol/sdk-react-native 还在维护吗?

最新版本 4.14.7 发布于 2026/11/11(今天);至今共发布 66 个版本,其中过去 12 个月发布了 66 个;首次发布于 2026/02/17。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。