iOS-方案集成指南
本文档介绍了金融级APP实名认证方案iOS端集成开发流程。
一、运行示例工程
1、打开下载的iOS示例工程,如下图所示:
2、全局搜索关键词: #warning developer,找到宏定义BDFaceBaseSafeRequestBaseURL,修改这个值为指定的Server服务地址,具体如下图所示:
3、确认bundleId等信息是否正确,之后连接真机进行运行,之后可以看到如下界面:
4、点击开始身份认证,测试示例工程是否跑通,之后扫码身份证或输入身份证信息后,点击进行身份核验,验证成功可以看到如下界面:
5、示例工程运行成功,之后可以将示例工程代码集成到目标项目中。
二、集成步骤
1、将BDFaceSDK文件夹下所有文件拖动到目标项目中,如下图所示
2、将AipBase.framework, AipOcrSdk.framework和IdcardQuality.framework拖动到目标项目,如下所图示
3、在Build Phases中点击下面的+号,选择NewCopyFilePhases,添加一个CopyFiles,如下图所示
4、双击上图的CopyFiles,改为Embed Frameworks,同时Destination,改为framework,之后将AipBase.framework, AipOcrSdk.framework和IdcardQuality.framework拖动到下面,如下图所示:
5、Link Binary With Libraries中添加libc++.tbd、libz.tbd 如下图所示:
6、info.plist 文件中添加以下key
7、之后可以将人脸核验示例工程代码代码结合自身工程项目,将相关代码集成到目标工程中。
三、关键代码说明
1、人脸识别SDK鉴权代码如下,canwork方法返回YES,代表人脸SDK鉴权成功。
NSString* licensePath = [NSString stringWithFormat:@"%@.%@", FACE_LICENSE_NAME, FACE_LICENSE_SUFFIX ];
[[FaceSDKManager sharedInstance] setLicenseID:FACE_LICENSE_ID andLocalLicenceFile:licensePath andRemoteAuthorize:true];
NSLog(@"canWork = %d",[[FaceSDKManager sharedInstance] canWork]);
NSLog(@"version = %@",[[FaceSDKManager sharedInstance] getVersion]);
2、OCR SDK鉴权代码如下
NSString *licenseFile = [[NSBundle mainBundle] pathForResource:FACE_API_ORC_KEY ofType:FACE_SECRET_OCR_KEY];
NSData *licenseFileData = [NSData dataWithContentsOfFile:licenseFile];
[[AipOcrService shardService] authWithLicenseFileData:licenseFileData];
NSLog(@"ocr sd version: %@", [AipOcrService ocrSdkVersion]);
点击开始身份认证,可以成功进入如下界面,没有报错,表示OCR鉴权成功
3、返回拍照页面,并开始离线识别身份证:
-(void) startOCRSdk {
[self configCallback];
// 身份证识别
[AipCaptureCardVC clearIdCard];
_vc =
[AipCaptureCardVC ViewControllerWithCardType:CardTypeLocalIdCardFont
andImageHandler:^(UIImage *image) {
_idCardImage = image;
[[AipOcrService shardService] detectIdCardFrontFromImage:image
withOptions:nil
successHandler:^(id result){
_successHandler(result);
}
failHandler:_failHandler];
}];
4、调起人脸识别界面,BDFaceColorfulViewController为人脸识别Controller。注意,如果不适用OCR部分,那么这里需要传入自定义的姓名和身份证号字符串。
- (void)faceColor {
NSArray * colorArr = [[NSArray alloc] initWithObjects:@(FaceLivenessActionTypeLiveEye), @(FaceLivenessActionTypeLiveMouth), nil];
int r = arc4random() % [colorArr count];
BDFaceColorfulViewController* cvc = [[BDFaceColorfulViewController alloc] init];
BDFaceLivingConfigModel* model = [BDFaceLivingConfigModel sharedInstance];
[cvc livenesswithList:@[colorArr[r]] order:model.isByOrder numberOfLiveness:model.numOfLiveness];
cvc.modalPresentationStyle = UIModalPresentationFullScreen;
cvc.name = _idCardName;
cvc.idCardNumber = _idCardNumber;
[self presentViewController:cvc animated:YES completion:nil];
}
5、人脸识别完成结果回调函数
- (void)faceCallbackWithCode:(BDFaceCompletionStatus)status result:(NSDictionary *)result {
NSLog(@">>>>>>>>>>>faceCallbackWithCode, %ld %@", (long)status,[self showCompletionStatusWithType:status]);
MyLog(@"result = %@",result);
NSDictionary *dic = [self dictionaryWithJsonString:result[@"data"]];
[[BDFaceImageShow sharedInstance] setAuraLiveColor:[NSString stringWithFormat:@"licenseId:%@",dic[@"licenseId"]]];
if (status == BDFaceCompletionStatusCameraStarted) {
[self.videoCapture startRecordingVideo];
} else if (status == BDFaceCompletionStatusImagesSuccess) {
NSLog(@"%@", result);
} else if (status == BDFaceCompletionStatusSuccess) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.remindAnimationView stopActionAnimating];
BDFaceVerificationController *avc = [[BDFaceVerificationController alloc] init];
avc.modalPresentationStyle = UIModalPresentationFullScreen;
avc.name = _name;
avc.idCardNumber = _idCardNumber;
avc.receivedData = result;
if (@available(iOS 13.0, *)) {
avc.modalPresentationStyle = 0;
}
[self closeAction];
[self.presentingViewController presentViewController:avc animated:YES completion:nil];
});
}
注意:BDFaceCompletionStatusSuccess为采集结束,同时只有这个时候加密的信息才会在result中返回,BDFaceCompletionStatusImagesSuccess 只是流程上采集结束了,但是result是没有信息的,使用BDFaceCompletionStatusSuccess这个枚举即可。
6、动作活体返回状态回调:
- (void)livenessProcesssWithCode:(LivenessRemindCode)remindCode {
dispatch_async(dispatch_get_main_queue(), ^{
self.isAnimating = [self.remindAnimationView isActionAnimating];
});
switch (remindCode) {
case LivenessRemindCodeOK:
7、炫彩返回状态回调:
- (void)colorfulProcesssWithCode:(ColorRemindCode)code imageInfo:(NSDictionary *)images {
__weak typeof(self) weakSelf = self;
NSLog(@">>>>>>>> result code:%ld, info:%@", code, images);
switch (code) {
case ColorRemindCodeOK:
8、发请求BaseURL,如下图所示,开发者需要配置自己服务器的Host和端口号,进行相关请求;
9、进行姓名、身份证号和人脸比较,如下:
- (void)requestSafelyToCheckIdetifierCardAndPerson:(NSDictionary *)dic {
NSString *finantialVerificationIdCardPersonImageUrl = [NSString stringWithFormat:@"%@%@", BDFaceBaseSafeRequestBaseURL, @"/face/biz-demo/verify"];
NSString *urlString = [NSString stringWithFormat:@"%@", finantialVerificationIdCardPersonImageUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
10、进行图片比对,一般是自身服务器中有图片底库,客户端采集完之后上传一张图片,这两张图片进行比较,注意:imageKey开发者自定义传入(也就是存在服务器中的照片底库标识码)
- (void)requestSafelyToCompareImages:(NSDictionary *)dic {
NSString *finantialVerificationImageCompareUrl = [NSString stringWithFormat:@"%@%@", BDFaceBaseSafeRequestBaseURL, @"/face/biz-demo/match"];
NSString *urlString = [NSString stringWithFormat:@"%@", finantialVerificationImageCompareUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
NSString *skey = dic[@"skey"];
NSString *xDeviceId = dic[@"x-device-id"];
NSString *theDataString = dic[@"data"];
NSString *appPlatform = @"ios"; // ios 必须是小写,服务端定的
parameters[BDFaceKeyOfSkey] = skey ?: @"";
parameters[BDFaceKeyOfXdeviceId] = xDeviceId ?: @"";
parameters[BDFaceKeyOfApp] = appPlatform ?: @"";
NSDictionary *tempDataDic = [NSJSONSerialization JSONObjectWithData:[theDataString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:nil];
theDataString = tempDataDic[@"data"];
parameters[BDFaceKeyOfData] = tempDataDic[@"data"] ?: @"";
#warning developer 这里只是联调使用,imageKey需要根据自己代码确定,图片的唯一标识码是什么,不能使用如下一行的代码
NSString *imageKey = [[NSUserDefaults standardUserDefaults] objectForKey:@"imagekeyfortesting"];
parameters[BDFaceKeyOfRegisterKey] = imageKey ?: @"";
11、活体检测接口调用,如下图所示:
- (void)requestSafelyToCheckLive:(NSDictionary *)dic {
NSString *finantialVerificationCheckLiveUrl = [NSString stringWithFormat:@"%@%@", BDFaceBaseSafeRequestBaseURL, @"/face/biz-demo/faceverify"];
NSString *urlString = [NSString stringWithFormat:@"%@", finantialVerificationCheckLiveUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
四、服务端接口参数说明
4.1 实名认证接口
-url:face/biz-demo/verify
-请求方式:Content-Type 为 application/json,通过 json 格式化请求体
-返回值类型:JSON
-请求参数说明
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
skey | 是 | string | 加固版上报的密钥信息 skey |
x_device_id | 是 | string | 加固版上报的密钥信息 deviceId |
data | 是 | string | 加密数据 |
id_card_number | 是 | string | 身份证件号 |
name | 是 | string | 姓名(需要是 utf8 编码) |
verify_type | 否 | string | 0:大陆身份证 |
app | 是 | string | APP 类型:ios/android/universe |
-返回参数说明
参数名 | 类型 | 说明 |
---|---|---|
log_id | number | 调用的日志id |
error_code | number | 错误码,0通过,300002低分,300003高风险,300004身份证号与姓名不匹配或该身份证号不存在,300005公安网图片不存在或质量过低 |
error_msg | string | 错误信息 |
result | jsonObject | 认证返回的结果 |
+ verify_log_id | number | 核验日志id,用于查询错误原因 |
+ dec_image | string | SDK传入的解密的图片 |
4.2 人脸对比接口
-url:face/biz-demo/match
-请求方式:Content-Type 为 application/json,通过 json 格式化请求体
-返回值类型:JSON
-参数说明
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
skey | 是 | string | 加固版上报的密钥信息 skey |
x_device_id | 是 | string | 加固版上报的密钥信息 deviceId |
data | 是 | string | 加密数据 |
image_key | 是 | string | 对比图片key ,服务端根据图片key查询对比图片 |
-返回参数说明
参数名 | 类型 | 说明 |
---|---|---|
log_id | number | 调用的日志id |
error_code | number | 错误码,0通过,300002低分,300003高风险 |
error_msg | string | 错误信息 |
result | jsonObject | 认证返回的结果 |
+ verify_log_id | number | 核验日志id,用于查询错误原因 |
4.3 图片活体接口参数
-url:face/biz-demo/faceverify
-请求方式:Content-Type 为 application/json,通过 json 格式化请求体
-返回值类型:JSON
-参数说明
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
skey | 是 | string | 加固版上报的密钥信息 skey |
x_device_id | 是 | string | 加固版上报的密钥信息 deviceId |
data | 是 | string | 加密数据 |
zid | 否 | string | 风控参数:唯一标识 ZID |
phone | 否 | string | 风控参数:手机号 |
app | 是 | string | APP 类型:ios/android/universe |
-返回参数说明
参数名 | 类型 | 说明 |
---|---|---|
log_id | number | 调用的日志id |
error_code | number | 错误码,0通过,300002低分,300003高风险 |
error_msg | string | 错误信息 |
result | jsonObject | 认证返回的结果 |
+ verify_log_id | number | 核验日志id,用于查询错误原因 |
+ dec_image | string | SDK传入的解密的图片 |
五、人脸安全采集SDK接口文档
5.1 SSFaceSDK.h
包含其他头文件,及人脸扫描、活体验证状态码,同时还有执行业务流程的参数枚举等。没有一一列举,具体请参照头文件:
#import "FaceSDKManager.h"
#import "SSFaceDetectionManager.h"
// 参数枚举等
typedef NSString *FaceIdCardType NS_STRING_ENUM;
FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypeDefault; // 默认 大陆身份证
FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypeMTPIDCard; // 港澳居民来往内地通行证
FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypeFPRIDCard; // 外国人永久居留身份证
FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypePassport; // 定居国外的中国公民护照
// 活体检测返回状态
typedef NS_ENUM(NSUInteger, LivenessRemindCode) {
LivenessRemindCodeOK = 0, //成功
LivenessRemindCodeBeyondPreviewFrame, //出框
LivenessRemindCodeNoFaceDetected, //没有检测到人脸
LivenessRemindCodeMuchIllumination,
LivenessRemindCodePoorIllumination, //光照不足
LivenessRemindCodeImageBlured, //图像模糊
...
};
5.2 FaceSDKManager.h
图像采集行为和过程中需要的设置,属于全局配置。在原IDL库中FaceSDKManager基础上增加如下两个接口:
/**
* SDK云端校验设置
* 需要云端校验,需提前申请id和secret
*
* @param clientId api key
* @param clientSecret api secret
*/
- (void)setBCEClientId:(NSString *)clientId clientSecret:(NSString *)clientSecret;
/**
* SDK鉴权方法-文件授权
* SDK鉴权方法 必须在使用其他方法之前设置,否则会导致SDK不可用
*
* @param licenseID 授权ID
* @param licensePath 本地鉴权文件路径
* @param remoteAuthorize 是否远程更新过期鉴权文件
*/
- (void)setLicenseID:(NSString *)licenseID andLocalLicenceFile:(NSString *)licensePath andRemoteAuthorize:(BOOL)remoteAuthorize;
5.3 SSFaceDetectionManager.h
用于进行人脸识别具体行为动作。
@interface SSFaceDetectionManager : NSObject
// 图像返回帧处理代理
@property (nonatomic, weak) id<SSCaptureDataOutputProtocol> delegate;
// 采集流程运行状态
@property (nonatomic, assign, readonly) BOOL runningStatus;
// 风险检测超时时间:-1 关闭风险检测;大于0 风险检测超时时间;0 使用默认超时时间3秒
@property (nonatomic, assign) NSInteger riskDetectionSetting;
// 设置使用镜头,前置/后置
@property (nonatomic, assign) AVCaptureDevicePosition devicePosition;
// 输出形式,AVCaptureSessionPreset类型
@property (nonatomic, copy) NSString *sessionPresent;
// 采集图像区域
@property (nonatomic, assign) CGRect previewRect;
// 探测区域
@property (nonatomic, assign) CGRect detectRect;
// 是否开启声音提醒
@property (nonatomic, assign) BOOL enableSound;
// BDFaceDetectionTypeColorfulLiveness流程中是否开启动作活体,默认开启
@property (nonatomic, assign) BOOL enableLivenessInColorfulFlow;
+ (instancetype)sharedInstance;
- (void)connectPreviewLayer:(AVCaptureVideoPreviewLayer*)pLayer;
/**
* 创建用于实名认证的参数
*/
- (NSDictionary *)creatFaceVerifyParameters:(NSString *)idCardNumber
name:(NSString *)name
verifyType:(FaceIdCardType)cardType
nation:(NSString *)nation
phoneNumber:(NSString *)phoneNumber
livenessControl:(FaceLivenessControlType)livenessControl
spoofingControl:(FaceSpoofingControlType)spoofingControl
qualityControl:(FaceQualityControlType)qualityControl;
/**
* 创建用于人脸比对的参数
*/
- (NSDictionary *)createFaceMatchParametersWithRegisterImage:(NSString *)registerImageBase64
registerImageType:(FaceRegisterImageType)registerImageType
registerFaceType:(FaceFaceType)registerFaceType
faceType:(FaceFaceType)faceType
faceSortType:(FaceSortype)faceSortType
phoneNumber:(NSString *)phoneNumber
livenessControl:(FaceLivenessControlType)livenessControl
qualityControl:(FaceQualityControlType)qualityControl
registerLivenessControl:(FaceLivenessControlType)registerLivenessControl
registerQualityControl:(FaceQualityControlType)registerQualityControl;
/**
* 创建用于视频录制的参数
*/
- (NSDictionary *)createVideoRecordParametersWithEnableVideoRecording:(BOOL)enableVideoRecording
enableVideoSound:(BOOL)enableVideoSound
videoFileName:(NSString *)videoFileName
imageWidth:(NSUInteger)imageWidth
imageHeight:(NSUInteger)imageHeight;
/**
* 开始当前人脸校验流程
* @param detectionType 业务流程,采集信息用于实名认证、人脸比对
* @param parameters 流程需要的参数
* @param flowType 操作流程,人脸采集、人脸活体
* @param vc 用于进行人脸信息采集的ViewController
*/
- (void)startSessionWithType:(BDFaceResultReportType)detectionType
parameters:(NSDictionary *)parameters
faceFlow:(BDFaceFlowType)flowType
viewController:(UIViewController *)vc;
/**
* 开始当前人脸校验流程,供视频录制时传入参数使用
* @param detectionType 业务流程,采集信息用于实名认证、人脸比对
* @param parameters 流程需要的参数
* @param flowType 操作流程,人脸采集、人脸活体
* @param vc 用于进行人脸信息采集的ViewController
* @param videoParameters 需要录制视频的参数
* @param cameraAutoClose 镜头是否自动关闭
*/
- (void)startSessionWithType:(BDFaceResultReportType)detectionType
parameters:(NSDictionary *)parameters
faceFlow:(BDFaceFlowType)flowType
viewController:(UIViewController *)vc
videoParameters:(NSDictionary *)videoParameters
cameraAutoClose:(BOOL)cameraAutoClose;
/**
* 取消当前人脸校验流程
*/
- (void)cancel;
/**
* 开始视频录制,请与BDFaceCompletionStatusCameraStarted回调后调用
*/
- (void)startRecordingVideo;
/**
* 结束当前录制,活体验证session流程结束时自动结束,不需要主动调用;BDFaceDetectionTypeVideoRecording 时主动调用
*/
- (void)stopRecordingVideo;
/**
* 取消录制
*/
- (void)cancelRecording;
/**
* 活体检测过程中,返回活体总数,当前成功个数,当前活体类型
*/
-(void)livenessProcessHandler:(LivenessProcess)process;
/**
* 返回无黑边的方法
* @param array 活体动作数组
* @param order 是否顺序执行
* @param numberOfLiveness 活体动作个数
*/
- (void)livenesswithList:(NSArray *)array order:(BOOL)order numberOfLiveness:(NSInteger)numberOfLiveness;
5.4 通过startSession方法开始人脸采集后,通过SSCaptureDataOutputProtocol类型的delegate进行回调
/**
* 流程返回结果类型
*/
typedef NS_ENUM(NSInteger, BDFaceCompletionStatus) {
BDFaceCompletionStatusSuccess = 1, // 成功
BDFaceCompletionStatusNoRisk = 2, // 无风险
BDFaceCompletionStatusImagesSuccess = 3, // 图像采集成功
BDFaceCompletionStatusCameraStarted = 4, // 相机开始
BDFaceCompletionStatusIsRunning = -1, // 正在采集图像
BDFaceCompletionStatusResultFail = -2, // 云端服务执行失败
BDFaceCompletionStatusIsRiskDevice = -3, // 风险设备
BDFaceCompletionStatusCameraError = -5, // 没有授权镜头
BDFaceCompletionStatusTimeout = -6, // 超时
BDFaceCompletionStatusCancel = -7, // 取消
BDFaceCompletionStatusVideoRecordingFail = -8, // 视频录制错误
BDFaceCompletionStatusColorMatchFailed = -9, // 炫彩色彩错误
BDFaceCompletionStatusVideoColorScoreFailed = -10, // 炫彩分数错误
BDFaceCompletionStatusSDKNotInit = -13, // SDK未初始化
BDFaceCompletionStatusLicenseFail = -15, // 授权错误
BDFaceCompletionStatusNetworkError = -16, // 网络错误
};
@protocol SSCaptureDataOutputProtocol <NSObject>
// 帧图像回传,用于刷新UI使用
- (void)captureOutputSampleBuffer:(UIImage *)image;
// 本次人脸流程回调
- (void)faceSessionCompletionWithStatus:(BDFaceCompletionStatus)status result:(NSDictionary *)result;
// 活体检测状态
- (void)livenessActionDidFinishWithCode:(LivenessRemindCode)code;
// 人脸识别检测
- (void)detectionActionDidFinishWithCode:(DetectRemindCode)code;
// 炫彩活体状态回调
- (void)colorfulActionDidFinishWithCode:(ColorRemindCode)code imageInfo:(NSDictionary *)imageInfo;
@end
5.5 使用流程
具体代码请参考Demo,以下是流程概述:
// 1. 初始化Face License相关
NSString* licensePath = [NSString stringWithFormat:@"%@.%@", FACE_LICENSE_NAME, FACE_LICENSE_SUFFIX ];
[[FaceSDKManager sharedInstance] setLicenseID:FACE_LICENSE_ID andLocalLicenceFile:licensePath andRemoteAuthorize:YES];
// 2. 初始化Face相关设置属性
[[FaceSDKManager sharedInstance] setColorJudgeAbility:false]; //炫彩颜色判断能力
[[FaceSDKManager sharedInstance] setMaxCropImageNum:1]; // 设置照片采集张数,【注意:推荐设置成1张】
// 3. 设置所需动作活体动作
[[SSFaceDetectionManager sharedInstance] livenesswithList:_livenessArray order:_order numberOfLiveness:_numberOfLiveness];
// 4. 开始炫彩活体流程
NSDictionary *parameters = [self.videoCapture creatFaceVerifyParameters:@"身份证" name:@"姓名" verifyType:KFaceIdCardTypeDefault nation:nil phoneNumber:@"电话" livenessControl:nil spoofingControl:nil qualityControl:nil]; // 业务参数
NSDictionary *videoParas = [self.videoCapture createVideoRecordParametersWithEnableVideoRecording:YES enableVideoSound:YES videoFileName:@"whatmean" imageWidth:480 imageHeight:640]; // 视频录制参数
[self.videoCapture startSessionWithType:BDFaceResultReportTypeVerifySec parameters:parameters faceFlow:BDFaceDetectionTypeColorfulLiveness viewController:self videoParameters:videoParas cameraAutoClose:YES]; // 开始流程,【注意:faceFlow参数为Colorful】
// 5. 接收回调
- (void)colorfulActionDidFinishWithCode:(ColorRemindCode)code imageInfo:(NSDictionary *)imageInfo {
// 处理炫彩返回状态提醒
}
- (void)faceSessionCompletionWithStatus:(BDFaceCompletionStatus)status result:(NSDictionary *)result{
// 处理整体流程状态
if (status == BDFaceCompletionStatusCameraStarted) {
[self.videoCapture startRecordingVideo]; // 【注意:需要调用方法启动视频录制】
} else {
// 其他处理方式请参考demo
}
}
六、原金融级APP方案升级文档
1、从console平台下载新金融版示例工程代码,运行代码;
2、删除需要升级的项目中的如下framework和bundle
3、将示例工程代码中的如下文件,拷贝到现有工程的BDFaceSDK文件夹目录下;
4、现有工程目录如下:
5、Build Phases中添加libc++.tbd和libz.tbd两个库文件,如下图所示:
6、infoplist文件添加key值 Privacy - Microphone Usage Description,如下图所示:
7、搜索#import "IDLFaceSDK/IDLFaceSDK.h" 和 #import <IDLFaceSDK/IDLFaceSDK.h> 替换为 #import "FaceSDKLibHeader.h" 如下图所示:
8、删除BDFaceLivenessViewController和BDFaceDetectionViewController的.h和.m文件,并删除文中的所有代码引用。
9、删除代码 [IDLFaceLivenessManager sharedInstance].enableSound = YES;
10、全局搜索 IDLFaceDetectionManager 替换为SSFaceDetectionManager 如下图所示:
11、因为改动较大,建议整体替换 BDFaceBaseViewController 和 BDFaceColorfulViewController 的.h和.m文件;
12、关键流程介绍:
(1)开始识别代码:
- (void)startRecognize {
NSDictionary *parameters = [self.videoCapture creatFaceVerifyParameters:self.idCardNumber name:self.name verifyType:KFaceIdCardTypeDefault nation:nil phoneNumber:nil livenessControl:nil spoofingControl:nil qualityControl:nil];
NSDictionary *videoParas = [self.videoCapture createVideoRecordParametersWithEnableVideoRecording:YES enableVideoSound:YES videoFileName:@"whatmean" imageWidth:480 imageHeight:640];
[self.videoCapture startSessionWithType:BDFaceResultReportTypeVerifySec parameters:parameters faceFlow:BDFaceDetectionTypeColorfulLiveness viewController:self videoParameters:videoParas cameraAutoClose:YES];
}
(2)识别成功回调:
- (void)faceCallbackWithCode:(BDFaceCompletionStatus)status result:(NSDictionary *)result
注意:result为识别成功后,结果的回调,状态码BDFaceCompletionStatusSuccess为整个采集流程成功结束,此时,result才有数据;BDFaceCompletionStatusImagesSuccess仅仅表示采集动作结束,此时result没有数据。
(3) 动作活体结束:
- (void)livenessProcesssWithCode:(LivenessRemindCode)remindCode
(4)炫彩活体流程回调:
- (void)colorfulProcesssWithCode:(ColorRemindCode)code imageInfo:(NSDictionary *)images
13、运行修复剩余error,根据现有项目改动代码,运行代码;
14、修改BDFaceVerificationController.m,根据自身业务使用情况,将人证核验、人脸比对、活体检测请求代码移动到现有项目中;
15、全局搜索#warning developer,将BDFaceBaseSafeRequestBaseURL替换为自身服务器地址,如下图所示的代码:
16、请求接口改动,最新的流程使用了 SDK->自定义的服务器地址->请求百度人脸服务,请求部分代码接口在BDFaceVerificationController.m查看,具体有以下几个接口:
(1) 人证核验接口
- (void)requestSafelyToCheckIdetifierCardAndPerson:(NSDictionary *)dic
(2) 图片比对接口
- (void)receiveDataFromServerForCompareImage:(NSDictionary *)dic
(3)活体检测接口
- (void)receiveDataFromServerForCheckAlive:(NSDictionary *)dic
17、根据自身业务的使用,修改剩余代码。
七、不使用OCR及身份信息录入
1、下载完示例工程,配置Server地址,运行示例工程代码;点击开始身份核验,走完所有流程,可以出现如下界面:
2、删除如下图所示的库文件:
3、全局搜索 #import <AipOcrSdk/AipOcrSdk.h>,并删除所有引用;
4、搜索 -(void) startOCRSdk,注释如下函数:
5、搜索“OCR 能力加载“,注释以下代码:
6、在- (IBAction)startGatherAction:(UIButton *)sender 里注释以下代码:
AppDelegate *appDelegate = (AppDelegate*) [[UIApplication sharedApplication]delegate];
if (appDelegate.useOCR == 1) {
// OCR 身份证识别页面
[self startOCRSdk];
} else {
// 手动输入页面
BDFaceManualPersonalDataConfirmController * ocr = [[BDFaceManualPersonalDataConfirmController alloc] init];
if (@available(iOS 13.0, *)) {
ocr.modalPresentationStyle = 0;
}
[self presentViewController:ocr animated:YES completion:nil];
}
7、在- (IBAction)startGatherAction:(UIButton *)sender 方法里添加如下代码:
NSArray * colorArr = [[NSArray alloc] initWithObjects:@(FaceLivenessActionTypeLiveEye), @(FaceLivenessActionTypeLiveMouth), nil];
int r = arc4random() % [colorArr count];
BDFaceColorfulViewController* cvc = [[BDFaceColorfulViewController alloc] init];
BDFaceLivingConfigModel* model = [BDFaceLivingConfigModel sharedInstance];
[cvc livenesswithList:@[colorArr[r]] order:model.isByOrder numberOfLiveness:model.numOfLiveness];
cvc.modalPresentationStyle = UIModalPresentationFullScreen;
#warning developer 这里需要加入要识别的用户的姓名和身份证号
cvc.name = @"";
cvc.idCardNumber = @"";
[self presentViewController:cvc animated:YES completion:nil];
注意:上面的方法里的cvc.name = @"";和cvc.idCardNumber = @""; 引号里需要写上真真实的姓名和身份证,供之后采集人脸后,身份信息和人脸进行比对。
8、最终的- (IBAction)startGatherAction:(UIButton *)sender 函数如下:
9、在Viewcontroller.m 文件的头文件中,加入引用: #import "BDFaceColorfulViewController.h"
10、运行工程,点击下面的Button开始身份认证按钮即可开始人证核验过程。