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

## 平台支持（兼容性）

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

## 环境准备

[ CocoaPods 安装教程](https://guides.cocoapods.org/using/getting-started.html)

## 资源引入/集成

### 通过 CocoaPods 自动集成

podfile 里面添加以下代码：

```ruby
 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](https://github.com/yidun/alive-detected-iOS-demo.git)
  
## 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 表示动作检测容易通过<br>NTESSensitNormal 表示动作检测默认状态<br>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 : 活体检测通过<br> NTESLDCheckNotPass : 活体检测不通过<br>NTESLDOperationTimeout : 操作超时，用户未在规定时间内完成动作<br> NTESLDGetConfTimeout : 活体检测获取配置信息超时<br>NTESLDOnlineCheckTimeout : 云端检测结果请求超时,<br> NTESLDOnlineUploadFailure : 云端检测上传图片失败<br>NTESLDNonGateway : 网络未连接<br>NTESLDSDKError : SDK内部发生错误<br>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"}  二者只可能出现其中之一。<br>
  
    |监听回调字段|类型|描述|
    |---|----|-----|
    |action|NSDictionary|  key:当前执行的动作状态， 0表示正视前方，1表示右转头，2表示左转头，3表示张张嘴，4表示眨眨眼, -1表示未检测到完整人脸<br>value:对应动作的完成状态， NO表示该动作未完成 YES表示该动作已完成|
    |exception|NSString|异常状态， 1表示保持面部在框内 2表示环境光线过暗 3表示环境光线过亮 4表示请勿抖动手机|