由于最近要使用指纹解锁app,就暂且了解了一下,注释非常详细。需要注意的是在successBlock里面代码是后台线程执行的。
如果需要放在主线程,可添加到主线程上执行:
1、点击屏幕,弹出Touch ID框
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// ios8.0以上 iphone5s之后才有touchID功能
[self authenticateUser];
}
2、实现方法
- (void)authenticateUser
{
//初始化上下文对象
LAContext* context = [[LAContext alloc] init];
//localizedFallbackTitle设置为@""代表指纹输错不会出现右侧“输入密码”字样
context.localizedFallbackTitle = @"";
//错误对象
NSError* error = nil;
NSString* result = @"xxx利用你的Touch ID解锁";
//首先使用canEvaluatePolicy 判断设备是否支持Touch ID的状态
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 主线程
//支持指纹验证
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError \*error) {
#warning 后台线程
if (success) {
//验证成功,后台线程
NSLog(@"验证成功");
}
else
{
switch (error.code) {
case LAErrorSystemCancel:
{
//切换到其他APP,系统取消验证Touch ID 其他app切入
NSLog(@"切换到其他APP,系统取消验证Touch ID 其他app切入Authentication was cancelled by the system");
break;
}
case LAErrorAppCancel:
{
NSLog(@"用户不能控制的挂起 比如打电话");
break;
}
case LAErrorUserCancel:
{
//用户取消验证Touch ID
NSLog(@"用户取消验证Touch IDAuthentication was cancelled by the user");
break;
}
case LAErrorUserFallback:
{
NSLog(@"用户选择输入密码,切换主线程处理User selected to enter custom password");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//用户选择输入密码,切换主线程处理
}];
break;
}
case LAErrorTouchIDLockout:
{
NSLog(@"多次TouchID失败 Touch ID被锁");// 输入多次不正确 执行代码
break;
}
case LAErrorInvalidContext:
{
NSLog(@"LAContext对象被释放掉了,造成的授权失败");
break;
}
default:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//其他情况,切换主线程处理
}];
break;
}
}
NSLog(@"%@",error.localizedDescription);
}
}];
}
else{ //不支持指纹识别,LOG出错误详情。比如设备不支持或者指纹没开启(指纹没开启也包括输入错误多次被锁定Touch ID)
#warning 主线程
switch (error.code) {
case LAErrorTouchIDNotEnrolled:
{
// 设备Touch ID不可用 用户未录入
NSLog(@"设备Touch ID不可用 用户未录入TouchID is not enrolled");
break;
}
case LAErrorPasscodeNotSet:
{
// 系统未设置密码
NSLog(@"系统未设置密码A passcode has not been set");
break;
}
case LAErrorTouchIDNotAvailable:
{
// 设备Touch ID不可用,例如未打开
NSLog(@"设备Touch ID不可用,例如未打开A passcode has not been set");
break;
}
default:
{
// Touch ID被锁定之后,点击屏幕跳到这里
NSLog(@"TouchID not available");
break;
}
}
NSLog(@"%@",error.localizedDescription);
}
}