因为公司项目里需要用到指纹识别,就是类似于QQ那种的从后台进入前台后验证的。但是我发现通过指纹识别验证成功之后,如果是类似QQ那种模态出来的视图,会很快的收回去。但如果是导航控制器Push出来的视图,验证成功后,需要等几秒钟才会Push到下一个页面,这样肯定是不行的。
这是我之前的代码:
// 上下文对象
LAContext *context = [LAContext new];
// 存储错误信息
NSError *error = nil;
// 需要在弹出框中显示的文字,不可以为空
NSString *errorReason = NSLocalizedStringFromTable(@"验证指纹来登录洋葱", kLocTable, nil);
// 检查设备是不是可以使用biometrics(指纹识别)的方式验证身份(就是看看有没有指纹识别的硬件,或者有硬件但是没设定好指纹识别都是不可以进行验证的)
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 可用
// 判断输入的指纹是否正确
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:errorReason reply:^(BOOL success, NSError *error) {
if (success) {
// 验证成功后执行的代码
}
if (error){
DLog(@"error = %@",error);
switch (error.code) {
case -1:
DLog(@"验证指纹失败");
break;
case -2:
DLog(@"你点了取消");
break;
case -3:
DLog(@"你点了输入密码");
break;
case -4:
DLog(@"系统终止了验证");
break;
case -5:
DLog(@"用户没有在设备Settings中设定密码");
break;
case -6:
DLog(@"设备不支持Touch ID");
break;
case -7:
DLog(@"设备没有进行Touch ID 指纹注册");
break;
default:
break;
}
DLog(@"指纹验证失败");
}
}];
} else { // 不可用
DLog(@"你的设备不支持指纹");
}
问题就是如果验证成功后,通过导航控制器推到下一个页面,会等待一段时间才过去。之后我找到了通过多线程,并且提高优先级的方法来跳转页面,一下是代码:
dispatch_queue_t highPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.75 * NSEC_PER_SEC), highPriorityQueue, ^{
LAContext *context = [[LAContext alloc] init];
NSError *error = nil;
// 检查设备是否支持TouchID
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
// 如果设备支持TouchID,则展示给用户
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:NSLocalizedStringFromTable(@"验证指纹来登录洋葱", kLocTable, nil)
reply:^(BOOL success, NSError *error) {
if (success) {
// 验证成功的方法放到主线程里执行
dispatch_async(dispatch_get_main_queue(), ^{
// 这里放验证成功后执行的代码
});
}
else if (error) {
DLog(@"error = %@",error);
}
}];
}
});
此段代码也要延时一段时间执行,否则如果手指一直放在TouchID上进入App的话,可能会导致显示上的问题和其他错误。我写的延时是0.75秒,时间是很短的,不影响用户体验。以上就是解决此问题的方案