-(void)finger {
LAContext *context = [LAContext new];
context.localizedFallbackTitle = @"";
NSString *reasonStr = @"需要验证指纹才能进一步操作";
NSError *err;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&err]) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:reasonStr reply:^(BOOL success, NSError * _Nullable evalPolicyError) {
if (success) {
NSLog(@"授权成功");
//开始绑定
[self bind];
}else {
switch (evalPolicyError.code) {
case LAErrorSystemCancel:{
[self failedPrompt:@"系统取消授权"];
break;
}
case LAErrorUserCancel:{
[self failedPrompt:@"用户取消授权"];
break;
}
default:{
[self failedPrompt:@"授权失败"];
break;
}
}
}
}];
} else {
NSString *str = @"";
switch (err.code) {
case LAErrorTouchIDNotEnrolled:{
str = @"没有注册指纹";
break;
}
case LAErrorPasscodeNotSet:{
str = @"没有注册指纹验证码";
break;
}
default:
//LAErrorTouchIDNotAvailable
str = @"指纹识别不可用";
}
[self failedPrompt:str];
}
}
开门见山。如上贴出指纹识别的一些关键代码,其实就是围绕着LAContext做文章。LA就是Local Authentication的缩写,也就是本地授权。所有成功和失败的情况已经全部体现在代码中。值得注意的是用户输入错误3次以上就会提示输入指纹验证码,也就是iOS设备注册指纹的时候以防万一的备用code。这个code如果通过的话也算是验证成功,如果想要禁用掉这个功能可以在localizedFallbackTitle中设置成空字符串。其他可以自定义的属性可以在LAContext官方文档的实例方法列表中找到(例如可以允许的最大失败数,默认好像是3;再例如指纹作用延长的时间,也就是一次成功验证之后多长时间内不用再次验证。。搞支付的朋友们还是别动这个属性就好。。;还有其他一些属性,有空研究)
最后简单提一嘴应用场景和业务逻辑,我们是仿支付宝在账户安全中加的一个开关,如果本机不支持指纹识别则隐藏该列,否则可以手动打开和关闭,打开后要验证支付密码,比对成功之后再绑定。密码存在UserDefaults中,建议用用户名作为key。然后每次内部支付前检查是否绑定了指纹支付,通过指纹验证后直接把保存的密码发送给服务器即可。
网友评论