指纹识别必须ios8 以上真机,面部识别据说同一套API 没有支持面部识别的机器,没有测试,直接贴代码了,注释比较清晰,关键点在于业务逻辑,由于指纹识别只是类似授权自动登录,所以那些账户密码。必须存储,在授权成功自动登录,存储密码可参考keychain
ZbTouchManager.h
//
// ZbTouchManager.h
// TestFFmpegDemo
//
// Created by syStudio sy on 2019/4/22.
// Copyright © 2019 syStudio sy. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef enum _LOCALTOUCHIDRESULT{
LOCALTOUCHID_NOT_SUPPORT = 0 ,/*设备不支持*/
LOCALTOUCHID_SUCCESS,/*成功*/
LOCALTOUCHID_FAILD,/*失败*/
LOCALTOUCHID_UserCancel,/*用户取消*/
LOCALTOUCHID_UserFallback,/*用户选择输入密码*/
LOCALTOUCHID_SystemCancel,/*系统来电等导致*/
LOCALTOUCHID_PasscodeNotSet,/*用户没有设置密码*/
LOCALTOUCHID_NOT_Enrolled,/*用户没有设置touchID*/
LOCALTOUCHID_NOT_Available,/*用户touchiD无效*/
LOCALTOUCHID_Other_Reason,/*其它原因*/
}LocalAuthent_result;
@interface ZbTouchManager : NSObject
+(id)sharedInstance;
-(int)checkTouchIDActionWithComplete:(void(^)(NSDictionary*resultDic,LocalAuthent_result result))callback;
@end
NS_ASSUME_NONNULL_END
ZbTouchManager.m
//
// ZbTouchManager.m
// TestFFmpegDemo
//
// Created by syStudio sy on 2019/4/22.
// Copyright © 2019 syStudio sy. All rights reserved.
//
#import "ZbTouchManager.h"
#import <LocalAuthentication/LocalAuthentication.h>
#define RetDicReasonKey @"ZbResultDscStr"
@implementation ZbTouchManager
static ZbTouchManager *instance = nil;
+(id)sharedInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[ZbTouchManager alloc]init];
});
return instance;
}
-(int)checkTouchIDActionWithComplete:(void(^)(NSDictionary*resultDic,LocalAuthent_result result))callback{
NSMutableDictionary *retDic = [NSMutableDictionary dictionary];
if(NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0){
[retDic setValue:RetDicReasonKey forKey:@"版本低于8.0 不支持Touch ID"];
callback(retDic,LOCALTOUCHID_NOT_SUPPORT);
return LOCALTOUCHID_NOT_SUPPORT;
}
LAContext *context = [[LAContext alloc]init];
// 指纹认证错误后的第二个按钮文字(不写默认为“输入密码”)
context.localizedFallbackTitle = @"密码";
if (@available(iOS 10.0.0,*)) {
context.localizedCancelTitle = @"取消";
}
NSError *error = nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"home 键指纹识别" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
[retDic setValue:@"指纹识别验证成功" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_SUCCESS);
});
}else if(error){
switch (error.code) {
case LAErrorAuthenticationFailed:
[retDic setValue:@"指纹识别验证失败" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_FAILD);
break;
case LAErrorUserCancel:
[retDic setValue:@"用户取消" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_UserCancel);
break;
case LAErrorUserFallback:
[retDic setValue:@"用户不使用TouchID 选择搜懂输入密码" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_UserFallback);
break;
case LAErrorSystemCancel:
[retDic setValue:@"系统取消 比如遇到来电,等" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_SystemCancel);
break;
case LAErrorPasscodeNotSet:
[retDic setValue:@"用户没有设置密码" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_PasscodeNotSet);
break;
case LAErrorTouchIDNotEnrolled:
[retDic setValue:@"用户没有设置touchID" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_NOT_Enrolled);
NSLog(@"用户没有设置touchID");
break;
case LAErrorTouchIDNotAvailable:
[retDic setValue:@"用户touchiD 无效" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_NOT_Available);
break;
default:
[retDic setValue:@"其它未知原因" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_Other_Reason);
break;
}
}
}];
}else{
[retDic setValue:@"设备不支持touchiID" forKey:RetDicReasonKey];
callback(retDic,LOCALTOUCHID_NOT_SUPPORT);
}
return LOCALTOUCHID_NOT_SUPPORT;
}
@end
参考文章