//
|
// HDLTouchID.m
|
// TDTouchID
|
//
|
// Created by HDL on 2019/8/22.
|
// Copyright © 2019 TuDou. All rights reserved.
|
//
|
|
#import "HDLTouchID.h"
|
|
|
|
@implementation HDLTouchID
|
|
+ (instancetype)sharedInstance {
|
static HDLTouchID *instance = nil;
|
static dispatch_once_t onceToken;
|
dispatch_once(&onceToken, ^{
|
instance = [[HDLTouchID alloc] init];
|
});
|
return instance;
|
}
|
|
- (void)HDL_showTouchIDWithDescribe:(NSString *)descTitle mlocalizedReason:(NSString *)mlocalizedReason blockState:(StateBlock)block {
|
|
if (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"系统版本不支持TouchID(必须高于iOS 8.0才能使用)");
|
block(HDLTouchIDStateVersionNotSupport, nil);
|
});
|
|
return;
|
}
|
|
|
LAContext *context = [[LAContext alloc] init];
|
|
context.localizedFallbackTitle = descTitle == nil ? @"输入密码验证":descTitle;
|
NSError *error = nil;
|
|
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
|
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:mlocalizedReason == nil ? @"通过Home键验证已有指纹":mlocalizedReason reply:^(BOOL success, NSError * _Nullable error) {
|
if (success) {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"TouchID 验证成功");
|
block(HDLTouchIDStateSuccess, error);
|
});
|
} else if (error) {
|
|
switch (error.code) {
|
case LAErrorAuthenticationFailed: {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"TouchID 验证失败");
|
block(HDLTouchIDStateFail, error);
|
});
|
break;
|
}
|
case LAErrorUserCancel: {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"TouchID 被用户手动取消");
|
block(HDLTouchIDStateUserCancel, error);
|
});
|
}
|
break;
|
case LAErrorUserFallback: {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"用户不使用TouchID,选择手动输入密码");
|
block(HDLTouchIDStateInputPassword, error);
|
});
|
}
|
break;
|
case LAErrorSystemCancel: {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"TouchID 被系统取消(如遇到来电,锁屏,按了Home键等)");
|
block(HDLTouchIDStateSystemCancel, error);
|
});
|
}
|
break;
|
case LAErrorPasscodeNotSet: {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"TouchID 无法启动,因为用户没有设置密码");
|
block(HDLTouchIDStatePasswordNotSet, error);
|
});
|
}
|
break;
|
case LAErrorTouchIDNotEnrolled: {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"TouchID 无法启动,因为用户没有设置TouchID");
|
block(HDLTouchIDStateTouchIDNotSet, error);
|
});
|
}
|
break;
|
case LAErrorTouchIDNotAvailable: {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"TouchID 无效");
|
block(HDLTouchIDStateTouchIDNotAvailable, error);
|
});
|
}
|
break;
|
case LAErrorTouchIDLockout: {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"TouchID 无效");
|
block(HDLTouchIDStateTouchIDLockout, error);
|
});
|
|
}
|
break;
|
case LAErrorAppCancel: {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"当前软件被挂起并取消了授权(如App进入了后台等)");
|
block(HDLTouchIDStateAppCancel, error);
|
});
|
}
|
break;
|
case LAErrorInvalidContext: {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"当前软件被挂起并取消了授权(LAContext对象无效)");
|
block(HDLTouchIDStateInvalidContext, error);
|
});
|
}
|
break;
|
default:
|
break;
|
}
|
}
|
}];
|
} else {
|
// [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"用来验证指纹!" reply:^(BOOL success, NSError * _Nullable error) {
|
// if (success) {
|
// dispatch_async(dispatch_get_main_queue(), ^{
|
// block(HDLTouchIDStateSuccess,error);
|
// });
|
// } else {
|
// dispatch_async(dispatch_get_main_queue(), ^{
|
// block(HDLTouchIDStateFail,error);
|
// });
|
// }
|
// }];
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"当前设备不支持TouchID");
|
block(HDLTouchIDStateNotSupport,error);
|
});
|
|
}
|
}
|
|
- (void)HDL_showFaceIDWithDescribe:(NSString *)mlocalizedReason blockState:(faceIDStateBlock)block {
|
NSError *error;
|
|
LAContext *context = [[LAContext alloc] init];
|
|
BOOL canAuthentication = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];
|
if (canAuthentication) {
|
[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:mlocalizedReason reply:^(BOOL success, NSError * _Nullable error) {
|
//注意iOS 11.3之后需要配置Info.plist权限才可以通过Face ID验证哦!不然只能输密码啦...
|
if (success) {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
block(HDLFaceIDStateSuccess,error);
|
});
|
} else {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
NSLog(@"当前软件被挂起并取消了授权(如App进入了后台等)");
|
block(HDLFaceIDStateFail,error);
|
});
|
}
|
}];
|
}
|
}
|
|
|
// 判断设备支持哪种认证方式 TouchID & FaceID
|
- (HDLTouchIDSupperType) HDL_canSupperBiometrics {
|
LAContext *context = [[LAContext alloc] init];
|
NSError *error;
|
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
|
if (error != nil) {
|
return HDLTouchIDSupperTypeNone;
|
}
|
if (@available(iOS 11.0, *)) {
|
return context.biometryType == LABiometryTypeFaceID ? HDLTouchIDSupperTypeFaceID : HDLTouchIDSupperTypeTouchID;
|
}
|
}
|
return HDLTouchIDSupperTypeNone;
|
}
|
|
|
@end
|