跳转到主要内容
一款轻量级、由服务端驱动的 iOS SDK,用于身份验证,只需极少配置。最新版本:4.13.2。

GitHub 代码仓库

在 GitHub 上查看源代码、版本发布和完整更新日志

原生 SDK: 这是 iOS 应用推荐的集成方式。原生 SDK 提供最佳的用户体验、经过优化的相机处理,并完整支持 NFC。


要求

iOS 版本兼容性

生物识别同意需要原生 SDK 4.10.0 或更高版本。 对于受伊利诺伊州、得克萨斯州或科罗拉多州法律约束的人员,Didit 可以在首次人脸采集前请求明确的生物识别同意。iOS SDK 4.10.0 及更高版本会显示该步骤。早期版本无法显示该步骤:其会话仍按原方式运行,决策结果会将同意报告为未收集(biometric_consent.reason: "BIOMETRIC_CONSENT_UNSUPPORTED_SDK")。如果您在这些州验证人员,请升级。

安装

自 4.0.0 起,SDK 提供多个可安装的变体,因此你的应用只需承担所用功能对应的二进制体积。请恰好选择一个变体,即一个 CocoaPods 子规范和一个 SwiftPM 库产品:
  • Core:体积最小,通过 Didit 自有的轻量检测器自动完成证件和自拍照采集。不包含 OpenSSL.xcframework,也没有 CoreNFC 运行时。
  • AutoDetection:自 4.11.0 起已弃用,与 Core 完全相同,请改用 Core。
  • NFC:在 Core 的基础上增加 NFC 护照和电子身份证芯片读取。
  • All:包含全部功能。安装 DiditSDK 且未指定子规范或产品名时,默认使用此变体。
各变体会为你的应用包增加以下体积(arm64 Mach-O,以 4.9.0 为基准测量):Core 约 11.1 MB,NFC 约 11.7 MB 加上约 4 MB 的 OpenSSL,AutoDetection 约 16.0 MB,All 约 16.6 MB 加上 OpenSSL。 检测模型本身在运行时下载并缓存,因此不计入应用的下载体积。 自 4.11.0 起,所有变体的自动采集都运行在 Didit 自有的轻量检测器上。TensorFlow Lite 不再是 SDK 的一部分,框架体积也因此变小,因为其翻译文件改为从二进制文件之外加载。 自 4.6.0 起,已发布的框架不再包含 Swift ABI 描述符(Xcode 会将其复制到每个应用中,但从不读取的构建元数据),也不再包含该变体无法播放的教程视频。从 4.5.4 或更早版本升级,仅此一项即可使应用缩小约 7-8 MB,无需修改代码。 App Store 在分发时会压缩二进制文件,因此空中下载的实际开销更低。每台设备的具体差异,请查看 App Store Connect 中的应用体积报告。
NFC 和 All 变体内置 OpenSSL.xcframework(OpenSSL 3.3.3,通过 NFCPassportReader 以 OpenSSL-Universal 3.3.3001 形式分发),它是 NFC 芯片认证所必需的,并且需要 iOS 15.0+。截至 4.0.6(含)的版本内置的是 OpenSSL 1.1.1s;4.0.7 及更高版本内置 OpenSSL 3.3.3,并附带自己的隐私清单和代码签名。请务必安装 4.0.7 或更高版本。注意,升级只能统一 OpenSSL 版本,无法消除 嵌入 冲突:如果你应用中的其他依赖也嵌入了 OpenSSL.framework(文件名相同,com.github.krzyzanowskim.OpenSSL Bundle ID 也相同),那么无论版本如何,两份副本都会在嵌入步骤中冲突。只保留一份:例如,按 SPM 标识覆盖另一个包,改用 Didit 发布的 OpenSSL.xcframework,以确保包内的二进制文件与本 SDK 构建时所用的一致。Core 和 AutoDetection 变体完全不链接任何 OpenSSL。
无论安装哪个变体,应用代码中的 import DiditSDK 都相同。

Swift Package Manager (推荐)

使用 Xcode 将该包添加到你的项目中:
  1. 前往 File > Add Package Dependencies
  2. 输入代码仓库 URL:
  1. 选择版本(或从 4.13.2 起选择 Up to Next Major),然后点击 Add Package
  2. 出现选择产品的提示时,为你的变体恰好选择一个库产品(参见上方表格)
或者在你的 Package.swift 中添加:
然后将以下产品中恰好一个添加到你的目标中:
Swift Package Manager 不会替你强制执行 iOS 15 的下限。 Package.swift 为整个包声明了 platforms: [.iOS(.v13)],因此 Xcode 会允许你将 DiditSDK 或 DiditSDKNFC 添加到 iOS 13 或 14 的目标中且不报错,但这两个产品都内置 OpenSSL.xcframework,并通过 NFCPassportReader 读取芯片,它们需要 iOS 15.0+。使用 All 或 NFC 产品时,请自行将目标的部署目标设为 15.0。CocoaPods 会通过子规范的 deployment_target 自动强制执行这一要求。

CocoaPods

DiditSDK 以二进制 podspec 的形式托管在代码仓库中(它不在公共 CocoaPods Trunk 上),因此你必须引用 podspec 的 URL。请恰好选择一个子规范:
Core 和 AutoDetection 可部署到 iOS 13;NFC 和 All 因 NFCPassportReader 需要 iOS 15。 然后运行:
执行 pod install 后,请打开生成的 .xcworkspace(而不是 .xcodeproj)。
Xcode 15+ rsync 错误:如果在构建时看到 Operation not permitted rsync 错误,请在项目的 Debug 和 Release 配置中,将 Build Settings → User Script Sandboxing(ENABLE_USER_SCRIPT_SANDBOXING)设置为 否。

手动安装 (XCFramework)

每个版本为每个变体各发布一个 XCFramework。从 GitHub Releases 页面下载你所用变体的压缩包,然后将 .xcframework 文件夹拖入 Xcode,并将其设置为 Embed & Sign。

Permissions

SDK 需要以下权限。请将这些配置添加到应用的 Info.plist 中:

Info.plist 配置示例

NFC 配置

仅在安装 NFC 或 All 变体时需要。如果您安装的是 Core 或 AutoDetection 变体,请跳过本节。 要为带芯片的护照和身份证启用 NFC 读取,请按以下步骤操作:
  1. 在 Xcode 中添加 NFC 功能:
    • 选择您的目标 → Signing & Capabilities → + Capability → Near Field Communication Tag Reading
  2. 在 Info.plist 中添加 ISO7816 标识符:
D392F000260100000001 可让 SDK 通过 JPKI 读取日本 My Number 卡。若不添加该标识符,iOS 不会将此卡报告给 SDK。My Number 卡读取功能尚未在生产环境中启用,该标识符对其他证件没有任何影响,因此您现在即可添加。
  1. 添加 Entitlements(在您的 .entitlements 文件中):
模拟器限制(NFC 和 All 变体):这些变体会链接 CoreNFC,而自 Xcode 12 起,模拟器中缺少 libnfshared.dylib。变通方法请参阅这个 Stack Overflow 帖子。此限制不适用于 Core 或 AutoDetection 变体。请仅在实体设备上测试 NFC 功能。

App Store 审核(NFC 和 All 变体):如果您安装的是 NFC 或 All 变体,即使您的工作流不使用 NFC,Apple 在审核时也可能要求提供演示视频,因为 SDK 二进制文件中包含 NFC 相关代码。请发送邮件至 support@didit.me 索取我们的 NFC 演示视频,用于提交给 Apple。此要求不适用于 Core 或 AutoDetection 变体。


快速开始

SwiftUI 集成

UIKit 集成


集成方式

SDK 支持两种集成方式:

方式一:UniLink(最简单)

无需后端。SDK 使用您在 Didit 控制台中获取的工作流 ID 直接创建会话。UniLink 方式(startVerification(workflowId:))仅支持 vendorData;如需其他会话参数,请使用方式二。
要通过 UniLink 将 vendorData 附加到会话,请在 Didit 控制台中启用 供应商数据 选项。

方式二:后端会话(生产环境推荐)

您的后端通过创建验证会话 API(POST /v3/session/)创建会话,该接口支持全部参数(contact_details、expected_details、metadata、callback 等),然后将 session_token 传递给 SDK。
这种方式让您可以完全控制以下内容:
  • 将会话与您的用户关联(vendor_data)
  • 设置联系方式和预期信息,用于交叉验证
  • 设置自定义元数据
  • 为每个会话配置回调
以上数据(联系方式、预期信息、元数据、回调)会发送至创建验证会话 API。

配置

使用 DiditSdk.Configuration 自定义 SDK 的行为:

配置选项

摄像头选项

摄像头选项与 Web SDK 摄像头选项一致。 每个镜头为 .front 或 .back。 如果设备没有所请求的镜头,SDK 会使用设备上的第一个摄像头。 在只有一个摄像头的设备上,摄像头切换按钮也会隐藏。 将切换按钮选项设为 false,即可将用户锁定在该步骤的默认镜头上。
主题与颜色:颜色、背景和引导页设置需要在 Didit Console 中通过您的白标设置进行配置,而不是在 SDK 配置中设置。这可确保各平台品牌一致。
选项 showLanguageSelector、showCloseButton、showExitConfirmation 和 closeOnComplete 与 Web SDK 的 DiditSdkConfiguration 一致。移动端专属的 languageLocale 和 fontFamily 选项之所以存在,是因为移动端 SDK 以原生方式渲染完整的验证界面(不同于 Web SDK,后者在 iframe 中交由托管前端处理)。

语言支持

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

高级会话参数

如需使用高级会话参数(contact_details、expected_details、metadata、callback),请使用 Backend Session 方式。您的后端需调用创建验证会话 API 并传入完整参数,然后将 session_token 传递给 SDK。

处理结果

VerificationResult 枚举提供验证的结果:

结果分支

SessionData 属性

错误类型

连接中断

如果设备在验证过程中断开连接,SDK 会在流程中显示“无网络连接”页面,而不是让步骤一直加载。 SDK 会在后台持续检测,一旦 Didit 恢复可访问,便会自动关闭该页面,用户会从所在的步骤继续操作。 该页面提供 Try Again 按钮;当 showCloseButton 为 true(默认值)时,还会提供 Exit Verification 按钮。 退出会以 .failed(error: .networkError, session:) 结束验证,使您的应用得知用户是因连接问题而离开的。

完整结果处理示例


以编程方式关闭验证

在 DiditSDK 3.6.0+ 中可用。
宿主应用可以使用 DiditSdk.shared.dismiss() 以编程方式结束正在进行的验证。当宿主需要接管屏幕时(例如应用进入后台),推荐使用这种方式关闭验证。
dismiss() 会走 SDK 的常规完成流程:关闭已展示的界面、重置内部状态,并使用 .cancelled(session:) 调用 .diditVerification 处理程序。如果已创建会话,该结果会携带当前的 sessionId。没有进行中的验证时,调用此方法不会产生任何效果。

应用进入后台时的关闭示例

请勿设置 DiditSdk.shared.isPresented = false 来关闭验证。该标志只在上升沿时触发展示,将其设为 false 不会产生任何效果。同样,在最顶层的视图控制器上调用 UIKit 的 dismiss(animated:) 也不受支持:它会绕过 SDK 的完成流程,因此你的 .diditVerification 处理程序永远不会被触发。

观察 SDK 状态

你可以观察 SDK 状态,以便自定义加载界面:

端到端示例,从后端会话到 iOS SDK 再到结果

这种模式是可用于生产环境的集成方案。你的后端创建会话,iOS 应用接收 session_token,然后由 SDK 运行整个流程。

1. 在后端创建会话

2. 在 iOS 中交换令牌并启动 SDK

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

SDK 结果便于界面反馈,但权威结果通过 Webhook 送达。HMAC 验证请参阅 Webhooks 指南。

完整的 SwiftUI 示例


最后修改于 2026年11月7日