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 变体。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 中:
NFC 配置
要启用对带芯片护照和身份证的 NFC 读取:-
在 Xcode 中添加 NFC 能力:
- 选择您的 target > Signing & Capabilities > + Capability > Near Field Communication Tag Reading
-
在
Info.plist中添加 ISO7816 标识符:
D392F000260100000001 让 SDK 能够通过 JPKI 读取日本 My Number Card。若没有它,iOS 不会向 SDK 报告该卡片信息。My Number Card 读取尚未在生产环境中启用,且该标识符对其他证件没有任何影响,因此您现在即可添加。
- 添加启用了 NFC 标签读取的授权文件:
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 运行时权限请求。当用户到达需要相机权限的步骤时:- 如果尚未授予相机权限,SDK 会提示用户授权
- 如果用户拒绝该权限,将显示带有 Try Again 按钮的错误消息
- 如果用户授予该权限,验证流程继续进行
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 发送至您的后端,切勿仅依赖客户端的结果。