对几种情况的说明
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);
原理说明:指纹识别只可认出‘活手指’,iPhone5s(及以后机型)上的指纹传感器是通过发出射频信号探测手指纹路的,而且只探测手指表皮下面的一层皮肤,这样可以防止指纹被复制、盗窃。
当用户连续多次使用Touch ID失败后,Touch ID会被锁,需要用户输入手机开机密码解锁,这一整套的交互iOS系统已经封装在LocalAuthentication.framework里了,系统会自动弹出相应的操作界面,不需要开发者去操心,这大大的简便了开发者的开发集成和逻辑处理
#import "ViewController.h"
#import <LocalAuthentication/LocalAuthentication.h>//指纹解锁需要加入这个引用
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
}
- (void)evaluateAuthenticate
{
QMWNWEAKSELF;
//创建LAContext
LAContext* context = [[LAContext alloc] init];//这个属性是设置指纹输入失败之后的弹出框的选项
context.localizedFallbackTitle =@"密码输入登录";//指纹识别失败后弹出框最右边的按钮内容,左边是取消。
NSError* error =nil;
NSString* result =@"请验证已有指纹";
//首先使用canEvaluatePolicy判断设备支持状态
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
//支持指纹验证
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success,NSError *error) {
if (success) {
//验证成功,主线程处理UI
NSLog(@"指纹解锁成功");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//用户选择输入密码,切换主线程处理
NSUserDefaults *def=[NSUserDefaults standardUserDefaults];
weakSelf.phonetf.text=[def objectForKey:@"username"];
weakSelf.verycodetf.text=[def objectForKey:@"password"];//*******测试用,上线的时候注释掉
}];
}
else
{
NSLog(@"%@",error.localizedDescription);
switch (error.code) {
caseLAErrorSystemCancel:
{
//系统取消授权,如其他APP切入
break;
}
caseLAErrorUserCancel:
{
//用户取消验证Touch ID
SLog(@"用户取消指纹解锁");
break;
}
caseLAErrorAuthenticationFailed:
{
//授权失败
break;
}
caseLAErrorPasscodeNotSet:
{
//系统未设置密码
SLog(@"为设置密码");
break;
}
caseLAErrorTouchIDNotAvailable:
{
//设备Touch ID不可用,例如未打开
SLog(@"为打开");
break;
}
caseLAErrorTouchIDNotEnrolled:
{
//设备Touch ID不可用,用户未录入
SLog(@"用户未录入指纹");
break;
}
caseLAErrorUserFallback:
{
//点击密码输入登录按钮调用这里的方法
//如果验证指纹失败,可以做其他操作,入跳转到手动输入密码页面
SLog(@"输入框失败后弹出的界面底部两个按钮右边一个的点击方法法");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//用户选择输入密码,切换主线程处理
}];
break;
}
default:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//其他情况,切换主线程处理
}];
break;
}
}
}
}];
}
else
{
//不支持指纹识别,LOG出错误详情
NSLog(@"不支持指纹识别");
switch (error.code) {
caseLAErrorTouchIDNotEnrolled:
{
SLog(@"TouchID is not enrolled");
break;
}
caseLAErrorPasscodeNotSet:
{
SLog(@"A passcode has not been set");
break;
}
default:
{
SLog(@"TouchID not available");
break;
}
}
SLog(@"%@",error.localizedDescription);
}
}
@end