一、两种鉴定方式
LAPolicyDeviceOwnerAuthenticationWithBiometrics :
生物指纹识别。验证弹框有两个按钮,第一个是取消按钮,第二个按钮可以自定义标题名称(输入密码)。只有在第一次指纹验证失败后才会出现第二个按钮,这种鉴定方式的第二个按钮的功能自定义。前三次指纹验证失败,指纹验证框不再弹出。再次重新进入验证,还有两次验证机会,如果还是验证失败,TOUCH ID 被锁住不再继续弹出指纹验证框。以后的每次验证都将会弹出设备密码输入框直至输入正确的设备密码方可解除TOUCH ID锁。
LAPolicyDeviceOwnerAuthentication:
生物指纹识别或系统密码验证。如果TOUCH ID 可用,且已经录入指纹,则优先调用指纹验证。其次是调用系统密码验证,如果没有开启设备密码,则不可以使用这种验证方式。指纹识别验证失败三次将弹出设备密码输入框,如果不进行密码输入。再次进来还可以有两次机会验证指纹,如果都失败则TOUCH ID被锁住,以后每次进来验证都是调用系统的设备密码直至输入正确的设备密码方可解除TOUCH ID锁。
二、鉴权错误信息类型
1. 验证(指纹/密码)不能开启的错误信息:
- LAErrorPasscodeNotSet : 设备密码未设置
- LAErrorTouchIDNotAvailable : TOUCH ID不可用
- LAErrorTouchIDNotEnrolled : 指纹未录入
- LAErrorTouchIDLockout : TOUCH ID被锁定
- LAErrorAppCancel : APP调用了
- (void)invalidate
方法使LAContext
失效 - LAErrorInvalidContext : 实例化的
LAContext
对象失效,再次调用evaluation...
方法则会弹出此错误信息
2. 其他错误信息:
- LAErrorAuthenticationFailed : 鉴定失败
- LAErrorUserCancel : 用户取消
- LAErrorUserFallback : 用户选择输入密码
- LAErrorSystemCancel : 系统取消(如:另外一个应用进入前台)
三、Show code
- (void)authentication
{
// 初始化上下文对象
LAContext* context = [[LAContext alloc] init];
NSError* error = nil;
NSString* result = @"需要您的支付进行支付";
context.localizedFallbackTitle = @"快捷支付";
NSLog(@"data before authentication = %@",[context evaluatedPolicyDomainState]);
// 首先使用canEvaluatePolicy 判断设备支持状态
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
// 支持指纹验证
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError *error) {
if (success) {
//验证成功,主线程处理UI
NSLog(@"验证成功...");
NSLog(@"data after authentication = %@",[context evaluatedPolicyDomainState]);
}else{
NSLog(@"%@",error.localizedDescription);
switch (error.code) {
case LAErrorSystemCancel:
{
NSLog(@"Authentication was cancelled by the system");
//切换到其他APP,系统取消验证Touch ID
break;
}
case LAErrorUserCancel:
{
NSLog(@"Authentication was cancelled by the user");
//用户取消验证Touch ID
break;
}
case LAErrorUserFallback:
{
NSLog(@"User selected to enter custom password");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//用户选择输入密码,切换主线程处理
}];
break;
}
case LAErrorAuthenticationFailed:
{
NSLog(@"Authentication Failed");
break;
}
case LAErrorTouchIDLockout:
{
NSLog(@"TOUCH ID is locked out");
break;
}
case LAErrorAppCancel:
{
NSLog(@"app cancle the authentication");
break;
}
case LAErrorInvalidContext:
{
NSLog(@"context is invalidated");
break;
}
default:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//其他情况,切换主线程处理
}];
break;
}
}
}
}];
}else {
NSLog(@"%@",error.localizedDescription);
//不支持指纹识别,LOG出错误详情
switch (error.code) {
case LAErrorTouchIDNotEnrolled:
{
NSLog(@"TouchID is not enrolled");
break;
}
case LAErrorPasscodeNotSet:
{
NSLog(@"A passcode has not been set");
break;
}
default:
{
NSLog(@"TouchID not available");
break;
}
}
}
}
第一次进来验证,第二行的文字 需要您的指纹进行支付 可以自定,此时第二个按钮隐藏,第一次验证失败后才显示。
第一次指纹验证失败,第二个按钮(标题自定义,默认为:输入密码)显示出来,第一种验证方式的此按钮功能自定,第二种验证方式的此按钮点击会调用设备密码输入框。
设备密码输入框