TouchID
TouchID
1、使用的SDK
使用的SDK LocalAuthentication.framework
提供给开发者的外部头文件:
LAPublicDefines.h
LAContext.h
LAError.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 // 用户没有设置TouchID
LAErrorTouchIDNotAvailable // 用户设备不支持TouchID
LAErrorTouchIDNotEnrolled // 用户没有设置手指指纹
LAErrorTouchIDLockout // 用户错误次数太多,现在被锁住了
LAErrorAppCancel // 在验证中被其他app中断
LAErrorInvalidContext // 请求验证出错
LAErrorNotInteractive
// 下方使用报错
LAErrorBiometryNotAvailable
LAErrorBiometryNotEnrolled
LAErrorBiometryLockout
-
Context实例方法:
-
/*
返回BOOL值,设备是否支持指纹或密码
LAPolicy:
仅生物识别:LAPolicyDeviceOwnerAuthenticationWithBiometrics
生物识别或密码识别:LAPolicyDeviceOwnerAuthentication
*/
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;
/*
LAPolicy:
仅生物识别:LAPolicyDeviceOwnerAuthenticationWithBiometrics
生物识别或密码识别:LAPolicyDeviceOwnerAuthentication
localizedReason:
提示描述(识别目的)
success:
识别通过
error:
识别失败
*/
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(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 mechanism
fallback按钮点击 [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
编号 4:由方法[context setLocalizedFallbackTitle:@"输入密码"] 设置,默认显示“输入密码”。点击后返回 LAErrorUserFallback ,error代码为:code: -3, reason: Fallback authentication mechanism 。若要不显示该编号按钮,则设置为空字符串(@“”)即可(如下如效果)。