New file |
| | |
| | | |
| | | |
| | | #import "TDTouchID.h" |
| | | |
| | | @implementation TDTouchID |
| | | |
| | | + (void)td_showTouchIDWithDescribe:(NSString *)desc BlockState:(StateBlock)block{ |
| | | |
| | | if (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) { |
| | | |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"系统版本不支持TouchID (必须高于iOS 8.0才能使用)"); |
| | | block(TDTouchIDStateVersionNotSupport,nil); |
| | | }); |
| | | |
| | | return; |
| | | } |
| | | |
| | | LAContext *context = [[LAContext alloc] init]; |
| | | |
| | | context.localizedFallbackTitle = desc ?: @"通过Home键验证已有指纹"; |
| | | |
| | | NSError *error = nil; |
| | | |
| | | if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { |
| | | |
| | | [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:desc ?: @"通过Home键验证已有指纹" reply:^(BOOL success, NSError * _Nullable error) { |
| | | |
| | | if (success) { |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"TouchID 验证成功"); |
| | | block(TDTouchIDStateSuccess,error); |
| | | }); |
| | | }else if(error){ |
| | | |
| | | switch (error.code) { |
| | | case LAErrorAuthenticationFailed:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"TouchID 验证失败"); |
| | | block(TDTouchIDStateFail,error); |
| | | }); |
| | | break; |
| | | } |
| | | case LAErrorUserCancel:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"TouchID 被用户手动取消"); |
| | | block(TDTouchIDStateUserCancel,error); |
| | | }); |
| | | } |
| | | break; |
| | | case LAErrorUserFallback:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"用户不使用TouchID,选择手动输入密码"); |
| | | block(TDTouchIDStateInputPassword,error); |
| | | }); |
| | | } |
| | | break; |
| | | case LAErrorSystemCancel:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等)"); |
| | | block(TDTouchIDStateSystemCancel,error); |
| | | }); |
| | | } |
| | | break; |
| | | case LAErrorPasscodeNotSet:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"TouchID 无法启动,因为用户没有设置密码"); |
| | | block(TDTouchIDStatePasswordNotSet,error); |
| | | }); |
| | | } |
| | | break; |
| | | case LAErrorTouchIDNotEnrolled:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"TouchID 无法启动,因为用户没有设置TouchID"); |
| | | block(TDTouchIDStateTouchIDNotSet,error); |
| | | }); |
| | | } |
| | | break; |
| | | case LAErrorTouchIDNotAvailable:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"TouchID 无效"); |
| | | block(TDTouchIDStateTouchIDNotAvailable,error); |
| | | }); |
| | | } |
| | | break; |
| | | case LAErrorTouchIDLockout:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"TouchID 被锁定(连续多次验证TouchID失败,系统需要用户手动输入密码)"); |
| | | block(TDTouchIDStateTouchIDLockout,error); |
| | | }); |
| | | } |
| | | break; |
| | | case LAErrorAppCancel:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"当前软件被挂起并取消了授权 (如App进入了后台等)"); |
| | | block(TDTouchIDStateAppCancel,error); |
| | | }); |
| | | } |
| | | break; |
| | | case LAErrorInvalidContext:{ |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"当前软件被挂起并取消了授权 (LAContext对象无效)"); |
| | | block(TDTouchIDStateInvalidContext,error); |
| | | }); |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | }]; |
| | | |
| | | }else{ |
| | | |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | NSLog(@"当前设备不支持TouchID"); |
| | | block(TDTouchIDStateNotSupport,error); |
| | | }); |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | @end |