TouchID
1、使用的SDK
使用的SDK LocalAuthentication.framework
提供给开发者的外部头文件:
LAPublicDefines.hLAContext.hLAError.h
使用时只需引入头文件:
#import <LocalAuthentication/LocalAuthentication.h>
2、使用条件
TouchID出现在iPhone5s机型上,在iOS8.0以后出现,所以使用时需要判断设备系统版本:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {}
3、LAContext
-
LAPolicy 枚举
-
typedef NS_ENUM(NSInteger, LAPolicy){/*仅使用指纹识别(生物识别)NS_ENUM_AVAILABLE(NA, 8_0)iOS8 可用*/LAPolicyDeviceOwnerAuthenticationWithBiometrics/*指纹识别失败后使用密码NS_ENUM_AVAILABLE(10_11, 9_0)iOS 9可用*/LAPolicyDeviceOwnerAuthentication}
-
LAError 枚举返回
LAErrorAuthenticationFailed, // 验证信息出错,就是说你指纹不对LAErrorUserCancel // 用户取消了验证LAErrorUserFallback // 用户点击了手动输入密码的按钮,所以被取消了LAErrorSystemCancel // 被系统取消,进入别的应用了,不在刚刚那个页面,所以没法验证LAErrorPasscodeNotSet // 用户没有设置TouchIDLAErrorTouchIDNotAvailable // 用户设备不支持TouchIDLAErrorTouchIDNotEnrolled // 用户没有设置手指指纹LAErrorTouchIDLockout // 用户错误次数太多,现在被锁住了LAErrorAppCancel // 在验证中被其他app中断LAErrorInvalidContext // 请求验证出错LAErrorNotInteractive// 下方使用报错LAErrorBiometryNotAvailableLAErrorBiometryNotEnrolledLAErrorBiometryLockout
-
Context实例方法:
-
/*返回BOOL值,设备是否支持指纹或密码LAPolicy:仅生物识别:LAPolicyDeviceOwnerAuthenticationWithBiometrics生物识别或密码识别:LAPolicyDeviceOwnerAuthentication*/- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;/*LAPolicy:仅生物识别:LAPolicyDeviceOwnerAuthenticationWithBiometrics生物识别或密码识别:LAPolicyDeviceOwnerAuthenticationlocalizedReason:提示描述(识别目的)success:识别通过error:识别失败*/- (void)evaluatePolicy:(LAPolicy)policylocalizedReason:(NSString *)localizedReasonreply:(void(^)(BOOL success, NSError * __nullable error))reply;
canEvaluatePolicy:error 在连续五次输入失败后返回错误代码:code: -8, reason: Biometry is locked out 此时再次启动应用调用 canEvaluatePolicy:error: 返回 NO,设备不再支持生物识别和密码识别
-
error 实测
-
switch (error.code) {case LAErrorAuthenticationFailed:/*code: -1, reason: Application retry limit exceeded验证次数超过上限,测试上限3次*/NSLog(@"LAErrorAuthenticationFailed");break;case LAErrorUserCancel:/*code: -2, reason: Canceled by user取消按钮点击 [context setLocalizedCancelTitle:@"cancle"]*/NSLog(@"LAErrorUserCancel");break;case LAErrorUserFallback:/*code: -3, reason: Fallback authentication mechanismfallback按钮点击 [context setLocalizedFallbackTitle:@"fallback"];*/NSLog(@"LAErrorUserFallback");break;case LAErrorSystemCancel:NSLog(@"LAErrorSystemCancel");break;case LAErrorPasscodeNotSet:NSLog(@"LAErrorPasscodeNotSet");break;case LAErrorTouchIDNotAvailable:NSLog(@"LAErrorTouchIDNotAvailable");break;case LAErrorTouchIDNotEnrolled:NSLog(@"LAErrorTouchIDNotEnrolled");break;case LAErrorTouchIDLockout:/*code: -8, reason: Biometry is locked out连续五次错误,指纹识别关闭*/NSLog(@"LAErrorTouchIDLockout");break;case LAErrorAppCancel:NSLog(@"LAErrorAppCancel");break;case LAErrorInvalidContext:NSLog(@"LAErrorInvalidContext");break;case LAErrorNotInteractive:NSLog(@"LAErrorNotInteractive");break;default:break;}
-
代码
-
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {LAContext *context = [[LAContext alloc] init];if (@available(iOS 10.0, *)) {// 默认是 “取消”[context setLocalizedCancelTitle:@"取消"];}// 再试一次时,显示的右侧按钮,默认是 “输入密码”[context setLocalizedFallbackTitle:@"输入密码"];NSError *error = nil;if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {NSLog(@"支持指纹识别");[context evaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请验证您的指纹以授权应用" reply:^(BOOL success, NSError * _Nullable error) {if (success) {NSLog(@"指纹验证通过");} else {NSLog(@"指纹验证失败 ---> %ld, %@", error.code, error.localizedDescription);}}];} else {/*设备不支持TouchID的原因有两种:1、设备本身硬件不支持(现在基本上没有该设备)2、错误次数超过上限,需要使用密码授权*/NSLog(@"设备不支持TouchID");}}
-
效果图
编号 1:默认显示内容,“东华车管”是应用名称。
编号 2:由方法evaluatePolicy:localizedReason:reply: 中localizedReason参数设置,不能为空字符串,或nil
编号 3:由方法[context setLocalizedCancelTitle:@"取消"] 设置,默认显示“取消”。点击后返回 LAErrorUserCancel ,error代码为:code: -2, reason: Canceled by user 。编号 4:由方法[context setLocalizedFallbackTitle:@"输入密码"] 设置,默认显示“输入密码”。点击后返回 LAErrorUserFallback ,error代码为:code: -3, reason: Fallback authentication mechanism 。若要不显示该编号按钮,则设置为空字符串(@“”)即可(如下如效果)。