1. 文档说明
| 文档名称 | 人脸实名认证APP5.0方案集成文档 |
|---|---|
| 所属平台 | iOS |
| 提交日期 | 2021-12-3 |
2. 版本说明
| 名称 | 版本号 |
|---|---|
| 名镜项目 | 5.0.0 |
| 系统支持 | iOS 9.0 + |
3. SDK说明
| SDK | 版本号 | 说明 | 类型 |
|---|---|---|---|
| BDFaceBaseKit.framework | 5.0.0 | 人脸采集SDK | 静态库 |
| AipOcrSdk.framework | 1.1.0 | OCR识别SDK | 动态库 |
| AipBase.framework | 1.0.0 | 基础工具类SDK | 动态库 |
| IdcardQuality.framework | 1.0.0 | 身份证质量控制SDK | 动态库 |
| BDFaceLogicLayer.framework | 1.0.0 | 名镜服务SDK | 静态库 |
4. 运行项目工程
4.1 打开下载的iOS示例工程
如下图所示:
4.2 使用如下链接请求百度Token
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度云应用的AK】&client_secret=【百度云应用的SK】 注意:上述百度云应用的AK和百度云应用的SK,应当替换为您自己名下的AK和SK。 详细获取资料,请参考:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu 最终获取到的token应如下图所示:
4.3 全局搜索关键词: #warning developer
注意:这种方式只是调试阶段的代码,上线代码不可用如下方式,而应该每次都重写获取,因为token会在一定时间内变化)可以找到如下,被注释的代码 /// self.accessToken = @"";如下图所示
【重要】这里这种写法仅仅用于测试功能,正式上线,token不能写成固定值,需要每次都请求。为了安全期间,建议将请求放到自己服务器上,做一层转发,而不是将AK,SK写在端上来请求。
打开这个注释,将上述token内容写入:例: self.accessToken = @"25.b55fe1d287227ca97aab219bb249b8ab.315360000.1798284651.282335-8574074"; 代码如下图所示:
4.4 确认bundleId等信息是否正确
连接真机进行运行,之后可以看到如下界面:
4.5 点击开始身份认证
测试示例工程是否跑通,之后扫码身份证或输入身份证信息后,点击进行身份核验,验证成功可以看到如下界面:
上图为示例工程运行成功,之后可以将示例工程代码集成到目标项目中。
5. 集成步骤
5.1 将BDFaceSDK文件夹下所有文件拖动到目标项目中
如下图所示
5.2 将AipBase.framework, AipOcrSdk.framework和IdcardQuality.framework DebugFramework.framework拖动到目标项目
如下所图示
5.3 将BDFaceSDK文件夹(如下图所示的文件夹)整体拖入到目标代码中;
5.4 在Build Phases中点击下面的+号
选择NewCopyFilePhases,添加一个CopyFiles(可重新命名为Embed)
5.5 双击CopyFiles
改为Embed Frameworks,同时Destination改为framework,之后将AipBase.framework、AipOcrSdk.framework和IdcardQuality.framework 拖动到下面
5.6 Link Binary With Libraries中添加libc++.tbd、libz.tbd 和 对应的framework
如下图所示:
5.7 确认添加的库文件设置正确
如下图所示,点击general, 这三个库需要为Do Not Embed:BDFaceBaseKit.framework, BDFaceLogicLayer.framework,CoreTelephony.framework.
5.8 info.plist 文件中添加以下key(获取相机和照片权限)
最后之后可以将人脸核验示例工程代码代码结合自身工程项目,将相关代码集成到目标工程中。
6. 授权文件、加密文件
人脸识别授权文件(idl-license.face-ios),图片加密文件(idl-key.face-ios),OCR身份证识别授权文件(aip.license),从console平台下载完iOS项目,这些文件即包括在下载的示例项目中,不需要特殊处理,按上面第5.3步整体拖入目标项目中即可。
7. 人脸相关接口
7.1 初始化接口
初始化接口调用 用于初始化人脸识别和OCR识别
| API | 描述 |
|---|---|
| -(instancetype)initWithController:(UIViewController * _Nonnull)controller face:(void(^)(void))initFaceBlock ocr:(void(^)(void))initOcrBlock | 传入当前controller,并初始化人脸和ocrSDK |
入参说明
| 参数 | 类型 | 说明 |
|---|---|---|
| controller | UIViewController * | 当前controller |
| initFaceBlock | Block对象 | 人脸识别初始化Block |
| initOcrBlock | Block对象 | OCR识别初始化Block |
initFaceBlock中,使用以下函数进行人脸SDK初始化 -(void)initCollectWithLicenseID:(NSString )licenseID andLocalLicenceName:(NSString )licenseName andExtradata:(NSDictionary *)extradata callback:(FaceSDKInitResultBlock )block;
回调状态码说明
| 参数 | 类型 | 说明 |
|---|---|---|
| BDFaceInitRemindCode | 枚举 | 初始化人脸的状态码,1000为成功,其他为失败,详情参考如下错误码说明 |
具体枚举值如下
| 枚举值 | 对应数字 | 说明 |
|---|---|---|
| BDFaceInitOK | 1000 | 初始化成功 |
| BDFaceLICENSE_NOT_INIT_ERROR | 1001 | license未初始化 |
| BDFaceLICENSE_DECRYPT_ERROR | 1002 | license数据解密失败 |
| BDFaceLICENSE_INFO_FORMAT_ERROR | 1003 | license数据格式错误 |
| BDFaceLICENSE_KEY_CHECK_ERROR | 1004 | license-key(api-key)校验错误 |
| BDFaceLICENSE_ALGORITHM_CHECK_ERROR | 1000 | 初始化成功 |
| BDFaceLICENSE_ALGORITHM_CHECK_ERROR | 1005 | 算法ID校验错误 |
| BDFaceLICENSE_MD5_CHECK_ERROR | 1006 | MD5校验错误 |
| BDFaceLICENSE_DEVICE_ID_CHECK_ERROR | 1007 | 设备ID校验错误 |
| BDFaceLICENSE_PACKAGE_NAME_CHECK_ERROR | 1008 | 包名(应用名)校验错误 |
| BDFaceLICENSE_EXPIRED_TIME_CHECK_ERROR | 1009 | 过期时间不正确 |
| BDFaceLICENSE_FUNCTION_CHECK_ERROR | 1010 | 功能未授权 |
| BDFaceLICENSE_TIME_EXPIRED | 1011 | 授权已过期 |
| BDFaceLICENSE_LOCAL_FILE_ERROR | 1012 | 本地文件读取失败 |
| BDFaceLICENSE_REMOTE_DATA_ERROR | 1013 | 远程数据拉取失败 |
| BDFaceLICENSE_LOCAL_TIME_ERROR | 1014 | 本地时间校验错误 |
| BDFaceOTHER_ERROR | 1015 | 其他错误 |
| BDFaceILLEGAL_PARAMS | 2001 | 非法的参数 |
| BDFaceMEMORY_ALLOCATION_FAILED | 2002 | 内存分配失败 |
| BDFaceINSTANCE_IS_EMPTY | 2003 | 实例对象为空 |
| BDFaceMODEL_IS_EMPTY | 2004 | 模型内容为空 |
| BDFaceUNSUPPORT_ABILITY_TYPE | 2005 | 不支持的能力类型 |
| BDFaceUNSUPPORT_INFER_TYPE | 2006 | 不支持的预测库类型 |
| BDFaceNN_CREATE_FAILED | 2007 | 预测库对象创建失败 |
| BDFaceNN_INIT_FAILED | 2009 | 预测库对象初始化失败 |
| BDFaceABILITY_INIT_FAILED | 2010 | 人脸能力初始化失败 |
| BDFaceABILITY_UNLOAD | 2011 | 能力未加载 |
| BDFaceABILITY_ALREADY_LOADED | 2012 | 人脸能力已加载 |
| BDFaceNOT_AUTHORIZED | 2013 | 未授权 |
| BDFaceABILITY_RUN_EXCEPTION | 2014 | 人脸能力运行异常 |
| BDFaceUNSUPPORT_IMAGE_TYPE | 2015 | 不支持的图像类型 |
| BDFaceIMAGE_TRANSFORM_FAILED | 2016 | 图像转换失败 |
7.2 实名认证接口
基于姓名和身份证号,调取公安权威数据源人脸图,将当前获取的人脸图片,与公安数据源人脸图进行对比,得出比对分数,并基于此进行业务判断是否为同一人。
注:如果配置APP方案时,身份信息录入的方式选择【业务调用时传入身份信息】,那么通过APP服务端接口获取姓名和证件号后,将获取到的姓名和证件号赋值给name和idcard_number字段即可。
| API | 描述 |
|---|---|
| -(void)startRecognize:(NSDictionary )dic callBack:(void(^)(int resultCode, NSDictionary resultDic))callBack; | 实名认证接口 |
入参dic (NSDictionary类型) key值列表如下:
| 参数 | Value类型 | 说明 | 必选 |
|---|---|---|---|
| BDFaceLogicServiceTokenKey | NSString | 访问Token,需要APP服务端通过AK、SK获取 | 是 |
| BDFaceLogicServiceNameKey | NSString | 在控制台配置的方案Id | 是 |
| BDFaceLogicServiceCardNumberKey | NSNumber | 姓名 | 是 |
| BDFaceLogicServiceCardTypeKey | NSString | 身份证类型(默认为0)0:大陆,1:港澳,2:外国,3:定居国外的中国护照 | 否 |
| BDFaceLogicServicePlanIdKey | NSString | 方案ID | 否 |
| BDFaceLogicServiceOnlineQualityControlKey | NSString | 质量控制参数 LOW:宽松 NORMAL:正常 | 否 |
| BDFaceLogicServiceLivenessQualityControlKey | NSString | 活体控制参数 LOW:宽松 NORMAL:正常 HIGH:严格 | 否 |
回调说明
| 参数 | 类型 | 含义 | 值 |
|---|---|---|---|
| resultCode | int | 错误码 | 0为成功,其他为失败,详情参考回调code错误码说明 |
| resultDic | NSDictionary | 回调结果 | 详情见下表 |
resultDic key值列表说明:
| Key值 | 类型 | 含义 |
|---|---|---|
| BDFaceLogicServiceReturnKeyForResultMsg | NSString | code对应的错误码,详情见code错误码说明 |
| BDFaceLogicServiceReturnKeyForResultData | Dictionary | 服务端返回结果,错误码为0时此字段存在内容,可以参考实名认证(V4)接口:https://ai.baidu.com/ai-doc/FACE/Cktmsru8w |
resultCode和resultMsg对应情况如下:
| resultCode | resultMsg |
|---|---|
| 0 | 成功 |
| -101 | 已有采集流程运行中 |
| -102 | 采集流程取消 |
| -103 | 安全SDK未初始化 |
| -104 | 未同意隐私协议 |
| -105 | 安全模块加载失败 |
| -106 | 网络异常 |
| -201 | 风控验证失败 |
| -301 | 云端验证异常 |
| -303 | 视频录制错误 |
| -304 | 线程异常 |
| -305 | 线筛选图片异常 |
| -306 | 采集前内部异常 |
| -307 | 活体验证步骤异常 |
| -308 | 预览异常 |
| -309 | 采集后内部异常 |
| -310 | 摄像头调起失败 |
| -401 | 超时,用户取消采集流程 |
| -402 | 炫彩异常 |
| -403 | 活体分数异常 |
| -404 | 活体分数异常 |
| -1000 | 内部错误 |
| -1001 | 网络异常 |
| -1002 | accessToken参数不合法 |
| -1003 | 姓名参数不合法 |
| -1004 | 证件号参数不合法 |
7.3 活体检测接口
包含本地活体加云端活体,本地活体分静默活体、炫彩活体、动作活体三种,云端活体可以判断图片中的人脸是否为二次翻拍以及是否为合成图攻击。
| API | 描述 |
|---|---|
| -(void)startRecognizeToCheckLive:(NSDictionary )dic callBack:(void(^)(int resultCode, NSDictionary resultDic))callBack; | 活体检测接口 |
入参dic (NSDictionary类型) key值列表如下:
| 参数 | 类型 | 说明 | 必选 |
|---|---|---|---|
| BDFaceLogicServiceTokenKey | NSString | 访问Token,需要APP服务端通过AK、SK获取 | 是 |
回调说明
| 参数 | 类型 | 含义 | 值 |
|---|---|---|---|
| resultCode | int | 错误码 | 0为成功,其他为失败,详情参考实名认证resultCode错误码说明 |
| resultDic | NSDictionary | 回调结果 | 详情见下表 |
callback key值列表说明:
| Key值 | 类型 | 含义 |
|---|---|---|
| BDFaceLogicServiceReturnKeyForResultMsg | NSString | code对应的错误码,详情见code错误码说明 |
| BDFaceLogicServiceReturnKeyForResultData | Dictionary | 服务端返回结果,错误码为0时此字段存在内容,可以参考活体检测(V4)接口:https://ai.baidu.com/ai-doc/FACE/Tktmssunb |
7.4 人脸采集接口
包含本地质量和本地活体,本地质量可以确保采集到的人脸图像符合各条件校验(满足姿态角、光照、模糊度、遮挡等校验),最终采集到的数据经过加密处理,需要配合开放平台接口使用。
| 返回值 | API | 描述 |
|---|---|---|
| -(void)startFaceCollect:(void(^)(int resultCode, NSDictionary *resultDic))callBack; | 人脸采集接口 |
回调说明
| 参数 | 类型 | 含义 | 值 |
|---|---|---|---|
| resultCode | int | 错误码 | 0为成功,其他为失败,详情参考实名认证code错误码说明 |
| resultDic | NSDictionary | 回调结果 | 详情见下表 |
resultDic key值列表说明:
| Key值 | 类型 | 含义 |
|---|---|---|
| resultMsg | String | 详情见code错误码说明 |
| sKey | String | 安全相关:sKey |
| xDeviceId | String | 安全相关:xDeviceId |
| data | String | 安全相关数据 |
7.5 人脸相关配置
人脸相关配置来自于百度云控制台下发的console_config.json文件,详细参考BDConfigFileParser类,不设置,将使用默认值。
8. OCR相关接口
8.1 OCR初始化接口
| API | 描述 |
|---|---|
| -(void) authWithLicenseFileData: (NSData *)licenseFileContent; | 将aip.license文件的NSData数据传入OCR SDK进行初始化和鉴权 |
入参说明
| 参数 | 类型 | 含义 |
|---|---|---|
| licenseFileContent | NSData | 将aip.license文件读出来,转发NSData类型 |
注:如果aip.license文件鉴权文件正确,那么可以使用OCR识别成功识别身份证信息。
8.2 OCR识别接口
| 返回值 | API | 描述 |
|---|---|---|
| UIViewController | -(UIViewController )startOcrRecognize:(BDAipOCRConfig )config didGetImage:(void(^)(UIImage image))getImageAction success:(void(^)(NSDictionary result))success failure:(void (^)(NSError *error))failure; | OCR识别接口 |
参数值列表如下:
| 参数 | 类型 | 说明 | 必选 |
|---|---|---|---|
| config | BDAipOCRConfig | 用于设置OCR页面相关UI | 否 |
| getImageAction | Block | 获取到的图片信息回调 | 否 |
| success | Block | 获取身份信息成功回调 | 否 |
| failure | Block | 获取身份信息失败回调 | 否 |
config配置说明
| 属性 | 类型 | 说明 |
|---|---|---|
| titleViewBgColor | UIColor | OCR页面导航栏背景色,默认为白色 |
| pageTitle | NSString | OCR标题内容,默认为"身份信息采集" |
| pageTitleTextColor | UIColor | OCR标题颜色,默认为黑色 |
| topTipText | NSString | OCR顶部扫描文字,默认为"请将您本人的\n身份证人像面放入框内" |
| topTipTextColor | UIColor | OCR 顶部文字颜色,默认为白色 |
9. 权限
| 名称 | 用途 |
|---|---|
| Privacy - Camera Usage Description | 获取相机权限,需要使用相机做人脸识别和OCR识别 |
| Privacy - Photo Library Additions Usage Description | iOS 11及以后保存照片到相册权限,OCR识别需要从相册选择照片 |
| Privacy - Photo Library Usage Description | 使用相册权限,OCR识别需要从相册选择照片 |
| Privacy - Microphone Usage Description | 人脸识别视频录制功能会使用该权限 |
10. 只使用人脸采集功能,不使用OCR部分代码
10.1 运行示例工程代码
点击开始身份核验,走完所有流程,可以出现如下界面:
10.2 删除库文件:AipOcrSdk.framework,AipBase.framework,IdcardQuality.framework
10.3 全局搜索与AipOcrSDK/AipOcrSdk.h
找到后并删除项目中所有引入对应SDK的代码,也可以注释,在删除后可能导致编译不通过,可以根据报错部分保证正常功能不受影响的同时进行相应的代码注释。
10.4 全局搜索 -(void) startOCRSdk 并注释该函数
注意:其他编译报错部分调用的地方也需要注释或删除
// 打开相机扫描
- (void)startOCRSdk {
[self configCallback];
// 身份证识别
[AipCaptureCardVC clearIdCard];
BDAipOCRConfig *config = [[BDAipOCRConfig alloc] init];
AipNavigationController *detectNavi = [AipCaptureCardVC viewControllerToDetectIdCard:config
handler:^(UIImage *image) {
_idCardImage = image;
[[AipOcrService shardService] detectIdCardFrontFromImage:image
withOptions:nil
successHandler:^(id result) {
_successHandler(result);
} failHandler:_failHandler];
}];
UIViewController *detectRoot = [[UIViewController alloc] init];
detectRoot.view.backgroundColor = [UIColor whiteColor];
detectRoot.view.clipsToBounds = YES;
[detectRoot addChildViewController:detectNavi];
[detectRoot.view addSubview:detectNavi.view];
[self.navigationController pushViewController:detectRoot animated:YES];
_vc = detectRoot;
__weak typeof(detectRoot) weakDetectRoot = detectRoot;
detectNavi.captureController.backAction = ^{
[weakDetectRoot.navigationController popViewControllerAnimated:YES];
};}
10.5 .编译运行代码首页并将身份证OCR功能关闭或者使用代码
// 身份证获取方式 1 OCR扫描 0 手动输入 2代码传
+ (int)useOCR {
BDConfigDataService *service = [self sharedInstance];
NSNumber *value = service.sharedDic[BDConfigDataServiceKeyForSettingOcr];
if (value) {
return value.intValue;
}
return [[BDConfigFileParser sharedInstance] useOCR];}
10.6 将userOCR的值设置为0
保证程序只能手动输入身份信息来调用人脸,此部分功能模块不使用也可以对应删除。
运行工程






