iOS SDK集成文档
更新时间:2026-11-09 15:18:04
CLNFCAuthSDK 集成文档
目录
1. 概述
CLNFCAuthSDK 是一个基于 NFC 技术的证件读取 SDK,支持通过 iPhone NFC 功能读取身份证证件信息。
SDK 采用 静态库(Static Framework) 形式分发。
功能一览
| 功能 | 说明 |
|---|---|
| 身份证读取(含照片) | 读取证件文字信息及原始照片数据 |
| 身份证读取(无照片) | 仅读取文字信息,速度更快 |
| 身份证读取(生成图片) | 读取证件并返回正反面 UIImage |
2. 环境要求
| 项目 | 要求 |
|---|---|
| Xcode | 15.0 及以上 |
| iOS 部署目标 | 12.0 及以上 |
| 设备架构 | arm64(真机) |
| 设备要求 | 支持 NFC 的 iPhone 机型(iPhone 7 及以上) |
| 语言 | Objective-C |
重要:NFC 读取功能仅支持真机运行,模拟器不支持。
3. 集成方式
3.1 添加 SDK 文件
将以下文件/文件夹拷贝到宿主工程目录下:
CLNFCAuthSDK/ ├── CLNFCAuthSDK.xcodeproj # SDK 工程文件 └── CLNFCAuthSDK/ ├── CLNFCAuthSDK.h # 伞头文件 ├── CLNFCReaderOC/ # 核心管理器 ├── Config/ # 配置类 ├── Errors/ # 错误定义 ├── Models/ # 数据模型 ├── Utils/ # 工具类 └── ZRGKReadCardSDK.framework # 底层静态库(必须一起携带)
3.2 Xcode 工程配置
步骤 1:添加工程引用
- 在 Xcode 中,右键点击项目导航器中的根节点 → Add Files to "你的工程"...
- 选择
CLNFCAuthSDK.xcodeproj,点击 Add
步骤 2:链接 Framework
在宿主 App Target → General → Frameworks, Libraries, and Embedded Content 中添加:
| Framework | 说明 |
|---|---|
CLNFCAuthSDK.framework | SDK 主框架(来自子工程产物) |
libc++.tbd | C++ 标准库 |
步骤 3:配置 Framework 搜索路径
在宿主 App Target → Build Settings → Framework Search Paths 中添加:
$(inherited) $(PROJECT_DIR)/CLNFCAuthSDK/CLNFCAuthSDK
确保
ZRGKReadCardSDK.framework所在目录被正确引用。
步骤 4:配置链接器标志(关键)
在宿主 App Target → Build Settings → Other Linker Flags 中添加:
-ObjC
必须添加:
-ObjC标志确保链接器加载静态库中所有 Objective-C 代码(包括 Category 方法)。缺少此标志会导致运行时崩溃(unrecognized selector sent to instance)。
4. 工程配置
4.1 NFC 能力配置
4.1.1 添加 Entitlements
在 Target → Signing & Capabilities → + Capability 中添加 NFC Tag Reading。
或手动编辑 .entitlements 文件:
<key>com.apple.developer.nfc.readersession.formats</key> <array> <string>TAG</string> </array>
4.1.2 Info.plist 配置
在 Info.plist 中添加以下配置项:
NFC 使用描述(必须):
<key>NFCReaderUsageDescription</key> <string>需要使用NFC读取证件信息</string>
ISO 7816 AID 标识(必须):
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key> <array> <string>F049442E43484E</string> <string>A0000002471001</string> </array>
网络传输安全(如需 HTTP 通信):
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
4.2 配置汇总清单
| 配置项 | 位置 | 值 |
|---|---|---|
| Other Linker Flags | Build Settings | -ObjC |
| Framework Search Paths | Build Settings | $(PROJECT_DIR)/CLNFCAuthSDK/CLNFCAuthSDK |
| NFC Tag Reading | Capabilities | 开启 |
| NFCReaderUsageDescription | Info.plist | NFC 使用说明 |
| select-identifiers | Info.plist | F049442E43484E, A0000002471001 |
| 链接库 | Frameworks | CLNFCAuthSDK.framework, ZRGKReadCardSDK.framework, libc++.tbd |
5. 初始化与使用
5.1 获取 Token
在调用 SDK 之前,需要先通过服务端接口获取 Token:
// 请求参数 NSString *appId = @"你的AppId"; NSString *appKey = @"你的AppKey"; // 生成32位随机请求ID NSString *requestId = [self generateRandomString:32]; // 请求Token NSString *url = @"https://wsapi.253.com/identity_auth/nfc/getToken"; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; request.HTTPMethod = @"POST"; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; NSDictionary *body = @{ @"appId": appId, @"appKey": appKey, @"requestId": requestId }; request.HTTPBody = [NSJSONSerialization dataWithJSONObject:body options:0 error:nil]; // 发送请求,解析 response[@"data"][@"token"]
5.2 初始化 SDK
#import <CLNFCAuthSDK/CLNFCAuthSDK.h> // 初始化(在读取证件前调用) NSError *error = [CLNFCReaderManager setupWithAppId:appId token:token]; if (error) { NSLog(@"SDK初始化失败:%@", error.localizedDescription); // 处理错误 } // 可选:开启日志 [CLNFCReaderManager setLogEnabled:YES];
注意:
appId和token均不能为空字符串,否则初始化将失败。
5.3 检查 NFC 可用性
if (![CLNFCReaderManager isNFCAvailable]) { // 当前设备不支持 NFC UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"该机型或当前系统不支持NFC读取功能" preferredStyle:UIAlertControllerStyleAlert]; [self presentViewController:alert animated:YES completion:nil]; return; }
5.4 读取身份证(含照片数据)
[CLNFCReaderManager readIDCardWithSuccess:^(CLNFCIDCardInfo *cardInfo) { NSLog(@"姓名:%@", cardInfo.name); NSLog(@"身份证号:%@", cardInfo.idNumber); NSLog(@"性别:%@", cardInfo.gender); NSLog(@"民族:%@", cardInfo.ethnicity); NSLog(@"出生日期:%@", cardInfo.birthday); NSLog(@"地址:%@", cardInfo.address); NSLog(@"签发机关:%@", cardInfo.issueAuthority); NSLog(@"有效期起:%@", cardInfo.validFrom); NSLog(@"有效期止:%@", cardInfo.validTo); // 照片原始数据 if (cardInfo.photoData) { UIImage *photo = [UIImage imageWithData:cardInfo.photoData]; } } fail:^(NSError *error) { NSLog(@"读取失败:%@", error.localizedDescription); }];
5.5 读取身份证(无照片,更快)
[CLNFCReaderManager readIDCardWithoutPhotoWithSuccess:^(CLNFCIDCardInfo *cardInfo) { NSLog(@"姓名:%@", cardInfo.name); NSLog(@"身份证号:%@", cardInfo.idNumber); } fail:^(NSError *error) { NSLog(@"读取失败:%@", error.localizedDescription); }];
5.6 读取身份证(生成正反面图片)
[CLNFCReaderManager readIDCardWithImagesSuccess:^(UIImage *frontImage, UIImage *backImage, CLNFCIDCardInfo *cardInfo) { // frontImage - 身份证正面图片 // backImage - 身份证背面图片 // 保存图片到本地 NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; [UIImageJPEGRepresentation(frontImage, 0.9) writeToFile:[docsPath stringByAppendingPathComponent:@"IDCardFront.jpg"] atomically:YES]; [UIImageJPEGRepresentation(backImage, 0.9) writeToFile:[docsPath stringByAppendingPathComponent:@"IDCardBack.jpg"] atomically:YES]; } fail:^(NSError *error) { NSLog(@"读取失败:%@", error.localizedDescription); }];
5.7 停止读取
// 主动停止当前读取操作 [CLNFCReaderManager stopReading];
5.8 完整调用示例
#import <CLNFCAuthSDK/CLNFCAuthSDK.h> @interface IDCardViewController () @property (nonatomic, copy) NSString *appId; @property (nonatomic, copy) NSString *token; @end @implementation IDCardViewController - (void)viewDidLoad { [super viewDidLoad]; // 1. 开启日志(可选) [CLNFCReaderManager setLogEnabled:YES]; // 2. 初始化 SDK NSError *error = [CLNFCReaderManager setupWithAppId:self.appId token:self.token]; if (error) { [self showAlert:@"初始化失败" message:error.localizedDescription]; return; } // 3. 检查 NFC 可用性 if (![CLNFCReaderManager isNFCAvailable]) { [self showAlert:@"提示" message:@"该机型不支持NFC读取功能"]; return; } } - (void)startReading { [CLNFCReaderManager readIDCardWithSuccess:^(CLNFCIDCardInfo *cardInfo) { dispatch_async(dispatch_get_main_queue(), ^{ [self displayCardInfo:cardInfo]; }); } fail:^(NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ [self handleError:error]; }); }]; } - (void)handleError:(NSError *)error { NSString *message; switch (error.code) { case CLNFCReaderErrorCodeNetworkUnavailable: message = @"网络不可用,请检查网络连接"; break; case CLNFCReaderErrorCodeNotSupported: message = @"当前设备不支持NFC"; break; case CLNFCReaderErrorCodeUserCancelled: message = @"已取消读取"; break; case CLNFCReaderErrorCodeTokenExpired: message = @"Token已失效,请重新获取"; break; case CLNFCReaderErrorCodeImageTypeNotSupported: message = @"证件类型不支持,请使用身份证"; break; default: message = error.localizedDescription; break; } [self showAlert:@"读取失败" message:message]; } @end
6. API 参考
CLNFCReaderManager
SDK 核心管理类,所有方法均为类方法(无需实例化)。
初始化与配置
| 方法 | 返回值 | 说明 |
|---|---|---|
+setupWithAppId:token: | NSError *(可空) | 初始化 SDK,传入 appId 和 token。失败返回 NSError |
+setLogEnabled: | void | 开关日志输出,默认关闭 |
+isNFCAvailable | BOOL | 检查当前设备是否支持 NFC |
+sdkVersion | NSString * | 获取 SDK 版本号 |
+isConfigured | BOOL | 检查 SDK 是否已初始化 |
读取操作
| 方法 | 回调内容 | 说明 |
|---|---|---|
+readIDCardWithSuccess:fail: | CLNFCIDCardInfo(含 photoData) | 读取身份证,包含照片原始数据 |
+readIDCardWithoutPhotoWithSuccess:fail: | CLNFCIDCardInfo(无照片) | 仅读取文字信息,速度更快 |
+readIDCardWithImagesSuccess:fail: | UIImage *front, UIImage *back, CLNFCIDCardInfo | 读取并生成正反面 UIImage |
+readIDCardAsyncWithSuccess:fail: | NSString *uuid | 异步加密模式,返回 UUID |
+stopReading | void | 停止当前读取操作 |
回调类型定义
typedef void(^CLNFCReaderIDCardSuccess)(CLNFCIDCardInfo *cardInfo); typedef void(^CLNFCReaderIDCardFail)(NSError *error); typedef void(^CLNFCReaderIDCardImageSuccess)(UIImage *frontImage, UIImage *backImage, CLNFCIDCardInfo *cardInfo);
7. 错误码
错误域:com.nfcreaderkit.oc.error
| 错误码 | 枚举值 | 说明 |
|---|---|---|
| 1002 | CLNFCReaderErrorCodeAppIdInvalid | AppId 缺失或无效 |
| 1003 | CLNFCReaderErrorCodeNetworkUnavailable | 网络不可用 |
| 1004 | CLNFCReaderErrorCodeInitializationFailed | 初始化失败 |
| 1005 | CLNFCReaderErrorCodeNotSupported | 当前设备不支持 NFC |
| 1006 | CLNFCReaderErrorCodeUserCancelled | 用户取消操作 |
| 1007 | CLNFCReaderErrorCodeDetectionFailed | 检测失败,识别失败 |
| 1008 | CLNFCReaderErrorCodeTagConnectionFailed | 连接芯片失败 |
| 1009 | CLNFCReaderErrorCodeServerConnectionFailed | 连接服务器失败 |
| 1010 | CLNFCReaderErrorCodeServerSendFailed | 发送数据失败 |
| 1011 | CLNFCReaderErrorCodeInstructionFailed | 指令执行出错 |
| 1012 | CLNFCReaderErrorCodeDataParseFailed | 数据解析失败 |
| 1013 | CLNFCReaderErrorCodeTokenExpired | Token 已失效 |
| 1014 | CLNFCReaderErrorCodeRequestFailed | 请求数据失败 |
| 1015 | CLNFCReaderErrorCodeImageGenerationFailed | 生成图片失败 |
| 1016 | CLNFCReaderErrorCodeImageTypeNotSupported | 图片类型不支持,仅支持身份证 |
| 1017 | CLNFCReaderErrorCodeAsyncTypeNotSupported | 异步加密证件类型不支持 |
| 9999 | CLNFCReaderErrorCodeUnknown | 未知错误 |
错误处理示例
if (error.code == CLNFCReaderErrorCodeTokenExpired) { // Token 过期,需要重新从服务端获取 [self refreshTokenAndRetry]; } else if (error.code == CLNFCReaderErrorCodeNetworkUnavailable) { // 提示用户检查网络 [self showNetworkAlert]; } else if (error.code == CLNFCReaderErrorCodeUserCancelled) { // 用户主动取消,通常无需处理 }
9. 常见问题
Q1:运行时崩溃 unrecognized selector sent to instance
原因:缺少 -ObjC 链接器标志。静态库中的 Objective-C Category 方法不会被链接器自动加载。
解决:在宿主 App Target → Build Settings → Other Linker Flags 中添加 -ObjC。
Q2:编译通过但运行提示"该机型不支持NFC"
原因:模拟器不支持 NFC 功能。
解决:使用支持 NFC 的真机(iPhone 7 及以上)进行调试。
Q3:初始化返回 "appId 不能为空" 或 "token 不能为空"
原因:setupWithAppId:token: 的 appId 和 token 参数均不能为空字符串。
解决:确保传入有效的 appId 和 token。Token 需通过服务端接口获取。
Q4:读取时提示 "Token已失效"
原因:Token 具有时效性,过期后需要重新获取。
解决:捕获 CLNFCReaderErrorCodeTokenExpired 错误,重新请求 Token 后再次初始化。
Q5:包体积影响
使用静态库会将 SDK 代码编译进最终二进制文件,会一定程度增大包体积。-ObjC 标志会加载所有 ObjC 代码(包括未使用的 Category),这是保证功能正常的必要代价。
附录:工程配置快速检查表
集成完成后,请逐项确认以下配置:
-
CLNFCAuthSDK.xcodeproj已添加到工程 - 已链接
CLNFCAuthSDK.framework - 已链接
ZRGKReadCardSDK.framework - 已链接
libc++.tbd - Framework Search Paths 包含
$(PROJECT_DIR)/CLNFCAuthSDK/CLNFCAuthSDK - Other Linker Flags 包含
-ObjC - 已开启 NFC Tag Reading Capability
- Info.plist 已配置
NFCReaderUsageDescription - Info.plist 已配置
select-identifiers(F049442E43484E、A0000002471001) - 使用真机调试(非模拟器)
- Deployment Target >= 12.0
这篇文档对您有帮助吗?




