活体检测

2024.11.20 10:20:47

    根据用户的少量动作,通过手机屏幕背景颜色的变化,分析不同颜色的光照在人脸上的信息,判断用户是否为活体、真人 相比于普通的活体检测,RGB活体检测可以减少用户做动作的数量(最少只需要1个动作),用户体验更佳

    平台支持(兼容性)

    条目 说明
    适配版本 iOS8以上
    开发环境 Xcode 11.4

    环境准备

    CocoaPods 安装教程

    资源引入/集成

    通过 CocoaPods 自动集成

    podfile 里面添加以下代码:

     source 'https://github.com/CocoaPods/Specs.git' // 指定下载源
     
    # 以下两种版本选择方式示例
    
    # 集成最新版SDK:
    pod 'NTESLiveDetect'
    
    # 集成指定SDK,具体版本号可先执行 pod search NTESLiveDetect,根据返回的版本信息自行决定:
    pod 'NTESLiveDetect', '~> 3.1.6'
    
    • 保存并执行 pod install 即可,若未执行 pod repo update,请执行pod install --repo-update

    手动集成

    • 1、添加易盾SDK,将压缩包中所有资源添加到工程中(请勾选Copy items if needed选项)
    • 2、添加依赖库,在项目设置target -> 选项卡General ->Linked Frameworks and Libraries添加如下依赖库,如果已存在如下的系统framework,则忽略:
      • AVFoundation.framework
      • CoreMedia.framework
      • AssetsLibrary.framework
      • CoreData.framework

    项目开发配置

    • 1、在Xcode中找到TARGETS-->Build Setting-->Linking-->Other Linker Flags在这个选项中需要添加 -ObjC
    • 2、将引入SDK头文件的.m文件重命名为.mm文件 或者 在Xcode中找到TARGETS-->Build Setting-->Apple Clang - Language-->Compile Source As在这个选项中选择 Objective-C++
    • 3、在 info.plist 里增加相机权限
    <!-- 相册 -->   
    <key>NSPhotoLibraryUsageDescription</key>   
    <string>App需要您的同意,才能访问相册</string>   
    <!-- 相机 -->   
    <key>NSCameraUsageDescription</key>   
    <string>App需要您的同意,才能访问相机</string> 
    

    调用示例

    @property (nonatomic, strong) NTESLiveDetectManager *detector;
    
    /// 初始化
    self.detector = [[NTESLiveDetectManager alloc] initWithImageView:"传入放置检测活体的imageView对象,imageView宽高比需设定为3:4" withDetectSensit:NTESSensitNormal];
    
    /// 开始活体检测
    __weak __typeof(self)weakSelf = self;
    [self.detector startLiveDetectWithBusinessID:BUSINESSID actionsHandler:^(NSDictionary * _Nonnull params) {
           
    } checkingHandler:nil completionHandler:^(NTESLDStatus status, NSDictionary * _Nullable params) {
        /// 活体检测状态
    }];
    

    更多使用场景请参考 demo

    SDK 方法说明

    1 初始化

    在项目需要使用 SDK 的文件中先引入 #import <NTESLiveDetect/NTESLiveDetectManager.h> 然后再初始化的 SDK,如下:

    @property (nonatomic, strong) NTESLiveDetectManager *detector;
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // withDetectSensit:活体检灵敏度类型
        self.detector = [[NTESLiveDetectManager alloc] initWithImageView:self.imageView withDetectSensit:NTESSensitNormal];
    }
    

    参数说明:

    参数 类型 是否必填 默认值 描述
    imageView UIImageView 传入放置检测活体的imageView对象,imageView宽高比需设定为3:4
    sensit enum NTESSensitEasy 表示动作检测容易通过
    NTESSensitNormal 表示动作检测默认状态
    NTESSensitHard 表示动作检测不容易通过

    2 开始活体检测验证

    代码说明:

    [self.detector startLiveDetectWithBusinessID:<#(nonnull NSString *)#> actionsHandler:^(NSDictionary * _Nonnull params) {
        // 获取活体检测结果      
    } checkingHandler:^{
        // 所有动作完成之后,活体进行云端检测。
    } completionHandler:^(NTESLDStatus status, NSDictionary * _Nullable params) {
        // 获取活体检测结果   
    }];
    
    • 参数说明:

      参数 类型 是否必填 默认值 描述
      businessID NSString 易盾分配的业务id
    • actionsHandler 回调参数说明

      回调字段 类型 描述
      params NSDictionary action:"123",活体检测动作。 0表示正视前方,1表示右转头,2表示左转头,3表示张张嘴,4表示眨眨眼。例如:actions = "123",表示需要做向右转头、向左转头、张张嘴三个动作
    • checkingHandler 所有动作完成之后,活体进行云端检测。可以在代码块里面加上自己的逻辑,例如正在进行云端检测的提示菊花,如果不需要传nil。

    • completionHandler 回调参数说明

      回调字段 类型 描述
      status enum NTESLDCheckPass : 活体检测通过
      NTESLDCheckNotPass : 活体检测不通过
      NTESLDOperationTimeout : 操作超时,用户未在规定时间内完成动作
      NTESLDGetConfTimeout : 活体检测获取配置信息超时
      NTESLDOnlineCheckTimeout : 云端检测结果请求超时,
      NTESLDOnlineUploadFailure : 云端检测上传图片失败
      NTESLDNonGateway : 网络未连接
      NTESLDSDKError : SDK内部发生错误
      NTESLDCameraNotAvailable : App未获取相机权限
      params NSDictionary token:"易盾分配的鉴权"

    3 停止活体检测

    代码说明:

    [self.detector stopLiveDetect];
    

    4 设置活体检测的超时时间

    代码说明:

    [self.detector setTimeoutInterval:timeoutInterval];
    

    参数说明:

    类型 是否必填 默认值 描述
    NSTimeInterval 30 10-120秒范围内的时间值,默认30秒

    5 检测状态监听

    代码说明:

    - (void)viewDidLoad {
        [super viewDidLoad];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(liveDetectStatusChange:) name:@"NTESLDNotificationStatusChange" object:nil];
    }
        	
    // 在相应的监听方法中进行动作提示:
    - (void)liveDetectStatusChange:(NSNotification *)infoNotification {
        NSDictionary *dic = infoNotification.userInfo;
        NSString *exception = [infoDict objectForKey:@"exception"];
        NSDictionary *action = [dic objectForKey:@"action"];
        NSNumber *key = [[action allKeys] firstObject];
        switch ([key intValue]) {
            case 0:
                // 正面提示
                break;
            case 1:
                // 右转头提示
                break;
            case 2:
                // 左转头提示
                break;
            case 3:
                // 张嘴提示
                break;
            case 4:
                // 眨眼提示
                break;
            default:
                break;
        }
        
        switch ([exception intValue]) {
            case 1:
                // 保持面部在框内
                break;
            case 2:
                // 环境光线过暗
                break;
            case 3:
                // 环境光线过亮
                break;
            case 4:
                // 请勿抖动手机
                break;
            default:
                break;
        }
    }
    
    • 监听回调值说明

      • 动作检测的数据结构:@{@"action":@{1 : YES}} 或者 @{@"exception":@"1"} 二者只可能出现其中之一。
      监听回调字段 类型 描述
      action NSDictionary key:当前执行的动作状态, 0表示正视前方,1表示右转头,2表示左转头,3表示张张嘴,4表示眨眨眼, -1表示未检测到完整人脸
      value:对应动作的完成状态, NO表示该动作未完成 YES表示该动作已完成
      exception NSString 异常状态, 1表示保持面部在框内 2表示环境光线过暗 3表示环境光线过亮 4表示请勿抖动手机
    在线咨询 电话咨询:95163223 免费试用