// // 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