不得不说,关于指纹解锁这儿的api 真的很方便,刚刚给自己的项目加上了指纹,所以记录一下
//1.判断版本
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
//可以使用指纹识别 5S 以后的机型
//2.判断是否可以使用指纹识别功能
LAContext *context = [[LAContext alloc]init];
//2.判断能否使用
//Evaluate 评估
//Policy 策略
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil] ) {
__weak typeof(self) weakSelf = self;
//3.开始启用指纹识别
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指纹登录" reply:^(BOOL success, NSError * _Nullable error) {
__strong typeof(weakSelf) strongSelf = weakSelf;
//判断是否成功
if (success) {
NSLog(@"验证成功!");
dispatch_async(dispatch_get_main_queue(), ^{
//此处进行其他操作,要放在主线程中
});
}else if(error != nil)
{
[self TouchIDResult:error.code];
}
}];
}else
{
//设置 密码解锁
LAContext *context = [[LAContext alloc] init];
[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"请输入设备密码" reply:^(BOOL success, NSError * _Nullable error) {
NSLog(@"error = %@", error);
if (success) {
//再次调用 调起指纹的方法
[self createUserFingerprint];
}
}];
}
}
error code分别对应的 解释:
-(void)TouchIDResult:(LAError)code
{
NSString *result = nil;
switch (code)
{
case LAErrorAuthenticationFailed:
{
result = @"指纹不匹配,请用账号密码登录";
break;
}
case LAErrorUserCancel:
{
result = @"用户取消了Touch ID验证";
break;
}
case LAErrorUserFallback:
{
result = @"用户不想进行Touch ID验证,想进行输入密码操作";
dispatch_async(dispatch_get_main_queue(), ^{
//用户选择输入密码,可以调起app自己的密码系统,也可调起手机的密码系统
});
break;
}
case LAErrorSystemCancel:
{
result = @"切换到其他APP,系统取消验证Touch ID";
break;
}
case LAErrorPasscodeNotSet:
{
result = @"您没有在设备Settings中设定密码";
break;
}
case LAErrorTouchIDNotAvailable:
{
result = @"您的设备不支持Touch ID";
break;
}
case LAErrorTouchIDNotEnrolled:
{
result = @"您的设备没有进行Touch ID 指纹注册";
break;
}
case LAErrorTouchIDLockout:
{
result = @"touchid被锁";
// 这里是验证错误次数上限了,touchid被锁,这时候需要调起系统的密码验证就行解锁touchid,不然touchid就不能使用了
LAContext* context = [LAContext new];
NSString* result = @"请输入手机密码";
//LAPolicyDeviceOwnerAuthentication:手机密码验证
[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:result reply:^(BOOL success, NSError *error){
if (success)
{
[self createUserFingerprint];
}
else
{
[self TouchIDResult:error.code];
}
}];
}
case LAErrorAppCancel:
{
result = @"应用取消验证";
break;
}
case LAErrorInvalidContext:
{
result = @"";
break;
}
}
//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
[self showText:result];
});
}
网友评论