跳转到主要内容
这是一个跨平台的 Flutter 插件,封装了原生 iOS 和 Android SDK,并提供统一的 Dart API,用于身份验证。

GitHub 仓库

在 GitHub 上查看源代码和示例

pub.dev 包

didit_sdk

原生 SDK:这是 Flutter 应用推荐的集成方式。该 SDK 通过平台通道封装了原生 iOS 和 Android SDK,可提供最佳的用户体验、经过优化的摄像头处理,以及完整的 NFC 支持。


要求

平台要求

生物识别同意需要原生 SDK 4.10.0 或更高版本。 对于适用 Illinois、Texas 或 Colorado 法律的用户,Didit 可以在首次人脸采集前请求用户明确给予生物识别同意。锁定 iOS 和 Android 原生 SDK 4.10.0 或更高版本的 Flutter SDK 版本会显示该步骤。较早版本无法显示该步骤:其会话照常运行,但决策结果会将同意标记为未收集(biometric_consent.reason: "BIOMETRIC_CONSENT_UNSUPPORTED_SDK")。如果您在这些州为用户进行验证,请升级。

安装

或者手动将其添加到 pubspec.yaml 中:
然后运行:

原生 SDK 变体

didit_sdk 内置完整的原生 SDK。 如需更小的二进制文件,可以改为依赖变体包。变体包公开的 Dart API 完全相同,并在两个平台上锁定与之匹配的原生 SDK 版本:
请只依赖以上其中一个包,并从您选择的包中导入,例如 package:didit_sdk_core/sdk_flutter.dart。

iOS 设置

本插件同时支持 Flutter 的两种 iOS 依赖管理工具:Swift Package Manager 和 CocoaPods。

Swift Package Manager

如果您的 Flutter 版本已启用 Swift Package Manager 支持(在 Flutter 3.24+ 上通过 flutter config --enable-swift-package-manager 手动开启),插件会自动以 Swift 包的形式引入。 无需配置 Podfile,原生 DiditSDK 依赖会自行从 GitHub 解析。 请在 Xcode 中(Runner 目标和项目)将应用的 iOS 部署目标设置为所选包的最低版本:didit_sdk 和 didit_sdk_nfc 为 15.0,didit_sdk_core 和 didit_sdk_autodetection 为 13.0。

CocoaPods

对于 didit_sdk,插件会根据 $DiditSdkIosVariant 选择原生 iOS SDK 变体。它是一个 Ruby 全局变量,需在应用的 ios/Podfile 中设置(DiditSDK pod 不在 CocoaPods trunk 上):
如果您使用变体包(didit_sdk_core、didit_sdk_autodetection、didit_sdk_nfc),它会直接锁定其原生子规格,并忽略 $DiditSdkIosVariant。请保持 Podfile 中的 pod 行和部署目标与该变体一致(例如使用 pod 'DiditSDK/Core', :podspec => ... 和 platform :ios, '13.0')。
all 和 nfc 变体需要 iOS 15.0+ 的部署目标;core 和 autodetection 可以面向 iOS 13.0。切换变体时,请先清理 CocoaPods(rm -rf Pods Podfile.lock),以免复用之前的 SDK 变体。
podspec URL 中的标签必须与您的 didit_sdk 版本所锁定的原生 iOS SDK 版本一致(4.13.2 对应原生 4.13.2)。如果 URL 指向较旧的标签,pod install 将无法完成解析:CocoaPods 会找到一个声明了较旧版本的 podspec,而插件要求版本完全匹配。升级 didit_sdk 时,请同时将此 URL 中的标签更新为相同版本。

Android 设置

默认情况下,插件依赖包含 NFC 的完整 Android SDK。若要在不含 NFC 的情况下构建,请在 android/gradle.properties 中添加以下内容:
此设置会将依赖从 me.didit:didit-sdk 切换为 me.didit:didit-sdk-core,从而移除 NFC 读取模块及其 JMRTD/SCUBA/BouncyCastle 依赖。 启用 NFC(默认)时,请在 android/app/build.gradle.kts 中添加以下打包规则,以解决 BouncyCastle 带来的重复元数据文件问题:
如果没有此规则,构建会因 mergeDebugJavaResource 错误而失败。当 diditSdkAndroidNfcEnabled=false 时,不需要此规则。
自插件 3.4.0 起,Android 原生 SDK 从远程 GitHub Maven 仓库解析,您的应用无需手动配置 Maven。

权限

iOS

将以下键添加到应用的 Info.plist 中:
如果缺少任何必需的 iOS 隐私键,SDK 一旦尝试访问该受保护资源,iOS 就会终止应用。例如,缺少 NSCameraUsageDescription 会导致用户点击证件相机的拍照按钮时应用崩溃。

NFC 配置

要启用对带芯片护照和身份证的 NFC 读取:
  1. 在 Xcode 中添加 NFC 能力:
    • 选择您的 target > Signing & Capabilities > + Capability > Near Field Communication Tag Reading
  2. 在 Info.plist 中添加 ISO7816 标识符:
D392F000260100000001 让 SDK 能够通过 JPKI 读取日本 My Number Card。若没有它,iOS 不会向 SDK 报告该卡片信息。My Number Card 读取尚未在生产环境中启用,且该标识符对其他证件没有任何影响,因此您现在即可添加。
  1. 添加启用了 NFC 标签读取的授权文件:
请确保应用的描述文件包含 NFC Tag Reading 能力。如果您的 Apple Developer 账户中未为该 bundle ID 配置 NFC,Xcode 将因缺少 com.apple.developer.nfc.readersession.formats 授权而签名失败。 对于 core 或 autodetection 变体($DiditSdkIosVariant)以及 didit_sdk_core / didit_sdk_autodetection 包,不需要此 NFC 配置,因为它们都不读取芯片。

Android

以下权限在 SDK 的 AndroidManifest.xml 中声明,并会自动合并: 相机和 NFC 硬件功能被声明为可选(android:required="false"),因此即使设备不具备这些功能,您的应用也可以安装。当 diditSdkAndroidNfcEnabled=false 时,SDK 不会添加 Android NFC 权限和功能。

运行时权限

SDK 会自动处理 Android 运行时权限请求。当用户到达需要相机权限的步骤时:
  1. 如果尚未授予相机权限,SDK 会提示用户授权
  2. 如果用户拒绝该权限,将显示带有 Try Again 按钮的错误消息
  3. 如果用户授予该权限,验证流程继续进行
调用 startVerification() 之前,您无需在应用代码中请求相机权限,SDK 会在内部处理。

快速开始


集成方式

SDK 支持两种集成方式:

方法 1: 会话 token (推荐用于生产环境)

使用创建验证会话 API在您的后端创建会话,然后将 token 传递给 SDK:
这种方式让您可以完全控制以下内容:
  • 将会话与您的用户关联(vendor_data)
  • 设置自定义元数据
  • 为每次会话配置回调

方法 2: 工作流 ID (更简单的集成)

对于更简单的集成,SDK 可以直接使用您的工作流 ID 创建会话,无需后端:
高级会话参数(contact_details、expected_details、metadata)仅通过会话 token 方式支持,此时您的后端调用创建会话 API并传入完整参数。将返回的 session_token 传递给 DiditSdk.startVerification()。

配置

通过传入 DiditConfig 对象自定义 SDK 行为:
调用 startVerificationWithWorkflow 时,以命名参数的形式传入 config:

配置选项

相机选项

相机选项与 Web SDK 相机选项 一致。 每个镜头为 CameraLens.front 或 CameraLens.back。 如果设备没有所请求的镜头,SDK 将使用其第一个可用相机。 在只有一个相机的设备上,相机切换按钮也会隐藏。 将切换选项设为 false,即可将用户锁定在该步骤的默认镜头上。
主题与颜色:颜色、背景和引导页设置需在 Didit 控制台中通过您的白标设置进行配置,而不是在 SDK 配置中设置。这样可以确保所有平台的品牌形象保持一致。

语言支持

SDK 支持 54 种语言。如果未指定语言,SDK 将使用设备区域设置,并以英语作为备用语言。
查看所有支持的语言 →

高级会话参数

contact_details、expected_details 和 metadata 等参数仅通过会话令牌方式支持。您的后端调用 POST /v3/session/ 并完整支持所有参数,然后将返回的 session_token 传递给 SDK。
Dart 的 startVerificationWithWorkflow 方法仅接受 workflowId、vendorData 和 config。3.4.0 之前的版本曾提供 contactDetails、expectedDetails 和 metadata 参数,但由于 Unilink endpoint 不支持这些参数,它们已被移除。

处理结果

startVerification 和 startVerificationWithWorkflow 都返回 Future<VerificationResult>。该结果是一个密封类:请使用模式匹配判断结果。

结果情况

SessionData 属性

错误类型

VerificationErrorType 枚举包含以下情况:

连接中断

如果设备在验证过程中断开连接,SDK 会显示“无网络连接”界面覆盖验证流程,而不是让某个步骤一直处于加载状态。 SDK 会在后台持续检测,一旦能够再次连接 Didit,就会自动关闭该界面,用户将从中断前所在的步骤继续操作。 该界面提供 重试 按钮;除非关闭按钮已关闭,否则还提供 退出验证 按钮。 退出会使验证以 VerificationFailed 结果结束,其错误类型为 networkError,因此您的应用可以知道用户是因网络连接问题而离开的。

完整结果处理示例


端到端示例 (后端会话 → Flutter SDK → Webhook)

这是可用于生产环境的集成方案:您的后端创建会话,您的 Flutter 应用接收 session_token,再由 SDK 运行整个流程。最终决策通过 Webhook 发送至您的后端,切勿仅依赖客户端的结果。

1. 后端创建会话

2. Flutter 交换令牌并启动 SDK

3. 后端通过 Webhook 接收最终决策

有关 HMAC 签名验证的详细信息,请参阅 Webhook 指南。

完整示例


最后修改于 2026年11月7日