集成指南
1.SDK目录结构
我们提供的Demo示例结构目录。
1.1 运行Demo
点击项目即可运行
1.2 配置下载天数和授权文件下载地址
接下来 运行即可
2.将SDK集成到开发环境
注意:
使用 SDK 前,首先需要将其集成到您的开发环境中。项目的开发环境需要在 Xcode 6.0版本及以上,运行环境需要 iOS7.0 及以上,下文将说明开发中需要的详细操作。
2.1 配置开发环境
2.1.1 需要添加 Xcode 链接器参数:-ObjC 和 -lstdc++。
添加 -ObjC 参数后链接器可以把静态库中所有的 Objective-C 类和分类都加载到最后的可执行文件中。
添加 -lstdc++ 参数是由于我们的静态库中需要 c++ 标准库支持。
添加方法:
TARGETS -> Build Settings -> Linking -> Other Linker Flags 中添加 -lstdc++ 和 -ObjC 。
2.1.2 如果使用的开发工具是Xcode 7.0以上版本,需要手动关闭Bitcode。
步骤:
TARGETS -> BuildSettings -> Enable Bitcode 设置为 NO。
2.1.3.添加相关引用库。
步骤:
TARGETS ->Build Phases中添加相关引用库
其中libLFLivenessDetector.a 是我们的静态库。
其他的为系统提供的库文件,按照下图中注意添加即可,
点击加号搜索相应的系统库
2.1.4.在Xcode8上调试iOS10系统时,调用相机功能时,在info.plist文件下添加权限。
需要在info.plist文件下添加相关的权限。
相机权限
<key>NSCameraUsageDescription</key> <string>cameraDesciption</string
2.2 将SDK集成到项目中
2.2.1 将demo中指定的文件夹(libLFMultipleLiveness)加入到已经配置好环境的xcode项目(以下称项目)中
打开我们提供的Demo,我们的Demo提供的是重UI,高度自定义UI的用户请参考API接口;LFLivenessDetector
接下来我们看如何将代码集成到环境中。
1、打开我们提给您的Demo工程文件夹,你将看到如下的结构
将选中的文件夹添加入项目中,选中如图中三项
2、将自动更新文件夹添加入项目,同第一步,选中三项。
我们已经把SDK代码添加入项目了编译一下,看下有没有报错。如果报错的话请参考2.1详细配置信息。
3、添加自动更新授权文件代码,这里的自动更新授权文件是非阻塞,如果您需要确保自动更新文件完成
在- (BOOL)application:(UIApplication)applicationdidFinishLaunchingWithOptions:(nullable NSDictionary )launchOptions;
方法中调用,传入license文件路径,详细请参考:License文件动态更新使用指南
//设置动态更新license文件
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *pathLicense = [[NSBundle mainBundle] pathForResource:@"LinkfaceID" ofType:@"lic"];
[LFUpDateLicenseManger loadLicensePath:pathLicense cachePath:[NSString stringWithFormat:@"%@/LinkfaceIDCacae",docDir]];
4、在项目中创建活体检测按钮
// 创建按钮开始活体检测
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 150, 50)];
[btn setTitle:@"开始活体检测" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[btn setBackgroundColor:[UIColor grayColor]];
[self.view addSubview:btn];
btn.center = self.view.center;
[btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
5、实现按钮的点击方法,这里在按钮的方法里实现了基本参数配置和初始化带有UI界面的活体检测控制器。
- (void)btnClick{
// 设置输出模式
NSString *outType = @"video";
// 设置难易程度,这里设置正常模式
LivefaceComplexity complexity = LIVE_COMPLEXITY_NORMAL;
// 设置动作序列,BLINK,MOUTH,NOD,YAW
NSArray *sequence = @[@"BLINK",@"MOUTH",@"NOD",@"YAW"];
NSDictionary *dict =@{@"sequence":sequence,
@"outType":outType,
@"Complexity":@(complexity)
};
// 转JSON
NSString *strJson = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding];
LFMultipleLivenessController *multipleLiveness = [[LFMultipleLivenessController alloc] init];
self.lfLienessVc = multipleLiveness;
self.lfLienessVc.delegate = self;
// 是否开启提示音,设置开启。
[self.lfLienessVc setVoicePromptOn:YES];
// 设置json
BOOL isJsonOk = [self.lfLienessVc setJsonCommand:strJson];
[self presentViewController:self.lfLienessVc animated:YES completion:^{
[self.lfLienessVc restart];
}];
}
6、实现LFMultipleLivenessDelegate代理方法
在代理方法中有开始回调、成功回调、失败回调、取消回调。
到这里你已经完成把SDK添加入新项目的的全部过程了。如果你想详细的了解实现逻辑请参考我们提供的Demo
文件
3.Lisense文件说明
我们当前版本的SDK是通过 License文件进行 BundleID 绑定校验授权。
4.License文件动态更新使用指南
4.1.说明
4.2.自动更新License文件集成步骤
4.2.1 传入License文件路径
在- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(nullable NSDictionary )launchOptions;方法中调用,传入license文件路径
//设置动态更新license文件
//获取沙盒document;
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// 获取Bundle中的license文件路径
NSString *pathLicense = [[NSBundle mainBundle] pathForResource:@"LinkfaceID" ofType:@"lic"];
[LFUpDateLicenseManger loadLicensePath:pathLicense cachePath:[NSString stringWithFormat:@"%@/ocrCacae",docDir]];
4.2.2、引入文件
引入更新文件管理类UPLicense文件夹,并修引用类,引入LFLivenessDetector.h文件。
4.2.3、说明
流程图示例
在LFUpDateLicenseManger.m文件中,首先判断沙盒中的license文件是否存在,如果存在则去验证license文件是否可用,不可用下载,可用继续后边流程;如果沙盒中的license文件不存在,则去取bundle中文件,然后验证是否可用,不可用去下载。代码事例:
// 是否存在
if ([[NSFileManager defaultManager] fileExistsAtPath:cachePath]) {
// 沙盒文件存在,取沙盒文件
[LFLivenessDetector loadLicensePath:cachePath];
} else {
// 沙盒文件不存在,取bundle中文件
[LFLivenessDetector loadLicensePath:licensePath];
}
// 判断文件是否可用,截止日期和是否可用。
if (([LFLivenessDetector getRemainingTime] < LFMaxRemainingTime) || ![LFLivenessDetector isLicenseValid]) {
// 不可用下载更新文件
[self updateLicense]
};
注意:截止时间宏LFMaxRemainingTime 和 url宏LFLicenseJsonUrlString 用户按需自行配置
4.2.4 下载文件
下载文件,获取license文件对应的json,json返回内容事例见4.3.2;该URL为定制方式,获取url请联系客服;详见Demo。
// 获取对用的json
- (void)updateLicense;
// 通过获取的json中对应的URL下载license文件,下载完之后保存沙盒中;
- (void)downloadlicenseFile:(NSString *)url;
4.2.5 检验文件
MD5验证下载后的license文件正确性.LFEncryption.h文件中
+ (NSString *)MD5ForLower32Bate:(NSString *)str;
4.2.6 保存文件
+ (BOOL)addLicCacheWithLicContent:(NSString *)licContent licCachePath:(NSString *)licCachePath
4.3、下载和接口说明
4.3.1 下载时序图
4.3.2获取license文件URL
请求URL:该URL为定制URL,获取方式请联系market@linkface.cn
请求方式:
GET 方式
请求参数:
无
返回参数:
字段名 | 说明 |
---|---|
md5 | 由lic文件得到的MD5,32位小写 |
start_time | license文件有效期起始时间,Unix时间戳格式 |
expired_time | license文件有效期结束时间,Unix时间戳格式 |
lic_url | license文件下载地址 |
出参json示例:
{
"md5": "qwertyhgfr567u8i987yt65rfghjkiuy",
"start_time": 1517500800,
"expired_time": 1546185600,
"lic_url": "http://www.linkface.com/license_url"
}
4.3、通过上一步请求回来的json中获取到的lic_url下载license文件
请求URL
//该URL为上一接口内返回的lic_url
http://www.linkface.com/license_url
请求方式:
GET方式
请求参数:
无
返回参数:
字段名 | 说明 |
---|---|
license | license文件 |
4.4、使用步骤
- 开发人员根据获取到的License文件信息Json中的lic_url下载相应License文件;
- 对该License文件做MD5得到32位小写字符串与License信息的json中md5字段的值进行比对,确保md5文件未经篡改;
- 将下载后的正确文件保存到本地用户提供的路径下;
4.5、其他
1、Demo中提供该版本的license文件更新机制代码。仅为有需求的用户提供参考.
5.同时集成活体 SDK和OCR SDK动态更新license文件注意事项
如果你同时集成了活体_SDK和OCR_SDK,在动态更新license文件时只需更新一个license文件即可。
具体说明如下:
5.1 获取lincense文件
在AppDelegate的didFinishLaunchingWithOptions 方法中
//设置动态更新license文件
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// 获取你的工程里面的license文件,名字可以自定义;
NSString *pathLicense = [[NSBundle mainBundle] pathForResource:@"这里填写工程里的license文件名称" ofType:@"lic"];
[LFUpDateLicenseManger loadLicensePath:pathLicense cachePath:[NSString stringWithFormat:@"%@/ocrCacae",docDir]];
5.2 引入UpLicense文件夹
LFUpDateLicenseManger.m 中
// 更新license文件 只需要做一次, 即在这三个类中(LFBankCard,LFIDCard,LFLivenessDetector), 选择一个,这里选用LFBankCard类更新lincense文件了,作为示例;
// 首先去判断沙盒中是否有license文件,如果存在就把路径保存进入SDK中,
if ([[NSFileManager defaultManager] fileExistsAtPath:cachePath]) {
[LFBankCard loadLicensePath:cachePath];
} else {
// 如果沙盒中不存在,则保存工程里的license文件路径进入SDK中
[LFBankCard loadLicensePath:licensePath];
}
//判断license文件是否可用,不可用则去下载,下载完成之后保存路径
if (([LFBankCard getRemainingTime] < LFMaxRemainingTime) || ![LFBankCard isLicenseValid]) [self updateLicense];
5.3 下载license文件完成保存lincense文件
- (void)downloadlicenseFile:(NSString *)url {
[LFLoadLicense downLoadLicenseUrl:url completeBlock:^(NSString * _Nullable license, NSError * _Nullable error) {
if (error == nil){
if ([self checkMd5String:license]){
//校验成功
if ([LFLicenseCache addLicCacheWithLicContent:license licCachePath:self.cachePath]){
// 保存license文件 OCR保存
[LFBankCard loadLicensePath:self.cachePath];
// 活体保存
[LFLivenessDetector loadLicensePath:self.cachePath];
}
}
}
}];
}
5.4 初始化你的SDK
在初始化时分别调用初始化的各自初始化方法即可;这里LFBankCrad举例:
LFBankCard *bankcard = [[LFBankCard alloc] initWithModelPath:modelPath extraPath:extraPath];
5.5 其他
1、如果你集成了其中一个SDK,并且完成了动态更新机制,SDK正常运行,再添加另外一个SDK时,如果你不想修改动态更新的逻辑代码;则你不需要关心这部分代码;正常初始化新添加SDK即可。