1.应用场景
指纹解锁、指纹登录、指纹支付
2.注意事项
5S开始才有的指纹识别, 目前绝大部分的设备都可以支持
iOS8的时候苹果开放了指纹识别的API
需要LocalAuthentication框架
3.实现代码
-(void)OnTouchIDBtn:(UIButton *)sender{
//判断版本号是否大于8.0 小于8.0则不支持指纹解锁
if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
[self createAlterView:@"不支持指纹识别"];
return;
}else{
//获取指纹传感器上下文
LAContext *ctx = [[LAContext alloc] init];
//设置 输入密码 按钮的标题
ctx.localizedFallbackTitle = @"验证登录密码";
//设置 取消 按钮的标题 iOS10之后
ctx.localizedCancelTitle = @"取消";
//检测指纹数据库更改 验证成功后返回一个NSData对象,否则返回nil
NSData *date = ctx.evaluatedPolicyDomainState;
NSLog(@"%@",date);
// 这个属性应该是类似于支付宝的指纹开启应用,如果你打开他解锁之后,按Home键返回桌面,再次进入支付宝是不需要录入指纹的。因为这个属性可以设置一个时间间隔,在时间间隔内是不需要再次录入。默认是0秒,最长可以设置5分钟
ctx.touchIDAuthenticationAllowableReuseDuration = 5;
/*---------------------------------------------------------------------*/
//iOS9之前用
//LAPolicyDeviceOwnerAuthenticationWithBiometrics
//连续三次指纹识别错误后,会自动弹出提示框(弹框需手动设置,系统仅返回一个error,根据error.code进行判断弹框内容),再2次指纹识别失败后,也就是 3 + 2 = 5次指纹识别失败后,Touch ID功能被锁定,就只能通过密码来进行身份验证和解锁Touch ID 功能(仅能通过屏幕解锁或系统设置进行解锁,不能弹出密码解锁视图)。
NSError * error;
_localizedReason = @"通过Home键验证已有手机指纹";
// 判断设备是否支持指纹识别
if ([ctx canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
// 验证指纹是否匹配,需要弹出输入密码的弹框的话:
[ctx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:_localizedReason reply:^(BOOL success, NSError * error) {
if (success) {
[self createAlterView:@"指纹验证成功"];
}else{
// 错误码 error.code
NSLog(@"指纹识别错误描述 %@",error.description);
//如果LAPolicyDeviceOwnerAuthenticationWithBiometrics
// -1: 连续三次指纹识别错误
// -2: 在TouchID对话框中点击了取消按钮
// -3: 在TouchID对话框中点击了输入密码按钮
// -4: TouchID对话框被系统取消,例如按下Home或者电源键
// -8: 连续五次指纹识别错误,TouchID功能被锁定,下一次需要输入系统密码
NSString * message;
switch (error.code) {
case -1://LAErrorAuthenticationFailed
message = @"已经连续三次指纹识别错误了,请输入密码验证";
_localizedReason = @"指纹验证失败";
break;
case -2:
message = @"在TouchID对话框中点击了取消按钮";
return ;
break;
case -3:
message = @"在TouchID对话框中点击了输入密码按钮";
break;
case -4:
message = @"TouchID对话框被系统取消,例如按下Home或者电源键或者弹出密码框";
break;
case -8:
message = @"TouchID已经被锁定,请前往设置界面重新启用";
break;
default:
break;
}
//弹框提示
[self createAlterView:message];
}
}];
}else{
if (error.code == -8) {
[self createAlterView:@"由于五次识别错误TouchID已经被锁定,请前往设置界面重新启用"];
}else{
[self createAlterView:@"TouchID没有设置指纹,请前往设置"];
}
}
/*---------------------------------------------------------------------*/
//iOS9之后用
//LAPolicyDeviceOwnerAuthentication ;
//连续三次指纹识别错误后,会自动弹出密码框,通过Touch ID的密码进行身份验证,如果此时取消密码验证,再1次指纹识别失败后,也就是 3 + 1 = 4次指纹识别失败后,Touch ID功能被锁定,就只能通过密码来进行身份验证和解锁Touch ID 功能(会弹出密码解锁视图)。
NSError * error;
_localizedReason = @"通过Home键验证已有手机指纹";
// 判断设备是否支持指纹识别
if ([ctx canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
// 验证指纹是否匹配,需要弹出输入密码的弹框的话:
[ctx evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:_localizedReason reply:^(BOOL success, NSError * error) {
if (success) {
[self createAlterView:@"指纹验证成功"];
}else{
// 错误码 error.code
NSLog(@"指纹识别错误描述 %@",error.description);
//如果LAPolicyDeviceOwnerAuthentication,在error中只能出现-2的错误代码
// -2: 在TouchID对话框中点击了取消按钮
//取消时不会出现createAlterView所以不需要设置失败弹窗
}
}];
}else{
[self createAlterView:@"TouchID没有设置指纹,请前往设置"];
}
/*---------------------------------------------------------------------*/
}
}
- (void)createAlterView:(NSString *)message{
UIAlertController * vc = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:vc animated:NO completion:^(void){
[NSThread sleepForTimeInterval:1.0];
[vc dismissViewControllerAnimated:YES completion:nil];
}];
}
4.常见错误整理
/*
typedef NS_ENUM(NSInteger, LAError)
{
//授权失败
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
//用户取消Touch ID授权
LAErrorUserCancel = kLAErrorUserCancel,
//用户选择输入密码
LAErrorUserFallback = kLAErrorUserFallback,
//系统取消授权(例如其他APP切入)
LAErrorSystemCancel = kLAErrorSystemCancel,
//系统未设置密码
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
//设备Touch ID不可用,例如未打开
LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable,
//设备Touch ID不可用,用户未录入
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,
} NS_ENUM_AVAILABLE(10_10, 8_0);
LAErrorTouchIDLockout NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorTouchIDLockout,
LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,
LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext
其中,LAErrorTouchIDLockout是在8.0中也会出现的情况,但并未归为单独的错误类型,这个错误出现,源自用户多次连续使用Touch ID失败,Touch ID被锁,需要用户输入密码解锁,这个错误的交互LocalAuthentication.framework已经封装好了,不需要开发者关心。
LAErrorAppCancel和LAErrorSystemCancel相似,都是当前软件被挂起取消了授权,但是前者是用户不能控制的挂起,例如突然来了电话,电话应用进入前台,APP被挂起。后者是用户自己切到了别的应用,例如按home键挂起。
LAErrorInvalidContext很好理解,就是授权过程中,LAContext对象被释放掉了,造成的授权失败。
*/