指纹识别

作者: Andy_Livings | 来源:发表于2020-04-16 19:02 被阅读0次

1、指纹识别功能是在iPhone5S之后推出的,SDK是iOS8.0推出的;
2、目的:简化移动支付环节。
3、使用步骤:

1.倒入框架#import <LocalAuthentication/LocalAuthentication.h>
2.获得当前系统版本号
3.实例化指纹识别对象,判断当前设备是否支持指纹识别功能(是否带有TouchID)

// 本地认证上下文联系对象
@property(nonatomic,strong) LAContext * context;
/// 方式一
- (IBAction)loginClick1 {
    
    //获得当前系统版本号
       float version = [UIDevice currentDevice].systemVersion.floatValue;
       
       if (version < 8.0) {
           
           NSLog(@"系统版本过低,请升级系统");
           return;
       }
    
    // 本地认证上下文联系对象,每次使用指纹识别验证功能都要重新初始化,否则会一直显示验证成功。
    self.context = [[LAContext alloc] init];
    NSError * error = nil;
    //验证是否具有指纹认证功能
    BOOL canEvaluatePolicy = [self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];
    if (error) {
        NSLog(@"%@", error.localizedDescription);
    }
    
    if (canEvaluatePolicy) {
        NSLog(@"有指纹认证功能");
        
        // 指纹认证错误后的第二个按钮文字(不写默认为“输入密码”)
        self.context.localizedFallbackTitle = @"add some data";
        
        // 调用指纹验证
        [ASFingerprintIdentification fingerprintIdentificationWithContext1:self.context];
        
    } else {
        NSLog(@"设备不支持指纹识别功能");
    }
}
/// 方式二
- (IBAction)loginClick2 {
    
    //获得当前系统版本号
    float version = [UIDevice currentDevice].systemVersion.floatValue;
    
    if (version < 8.0) {
        
        NSLog(@"系统版本过低,请升级系统");
        return;
    }
    
    // 本地认证上下文联系对象,每次使用指纹识别验证功能都要重新初始化,否则会一直显示验证成功。
    self.context = [[LAContext alloc] init];
    NSError * error = nil;
    //验证是否具有指纹认证功能
    BOOL canEvaluatePolicy = [self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
    
    if (error) {
        NSLog(@"%@", error.localizedDescription);
    }
    
    if (canEvaluatePolicy) {
        NSLog(@"有指纹认证功能");
        
        // 指纹认证错误后的第二个按钮文字(不写默认为“输入密码”)
        self.context.localizedFallbackTitle = @"add some data";
        
        // 调用指纹验证
        [ASFingerprintIdentification fingerprintIdentificationWithContext2:self.context];
        
    } else {
        
        NSLog(@"设备不支持指纹识别功能");
        // 没有指纹认证功能有可能是输入错误次数达到5次,认证功能被锁导致。
        BOOL isLock = (BOOL)[[NSUserDefaults standardUserDefaults] objectForKey:@"touchIdIsLocked"];
        
        if (isLock) {
            
            // 认证被锁处理
            [ASFingerprintIdentification touchIdIsLockedWithContext:self.context];
        }
    }
}

ASFingerprintIdentification实现了两种方式的验证,如下:

方式一

/// 方式一
+ (void)fingerprintIdentificationWithContext1:(LAContext *)context {
    
    [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"验证指纹以确认您的身份" reply:^(BOOL success, NSError *error) {
        
        // 切换到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            
            if (success) {
                
                NSLog(@"指纹验证成功");
            } else {
                
                NSLog(@"指纹认证失败,%@",error.description);
                NSLog(@"%ld", (long)error.code);
                // 错误码 error.code
                switch (error.code) {
                        
                    case LAErrorUserCancel: { NSLog(@"用户取消验证Touch ID");// 在TouchID对话框中点击了取消按钮或者按了home键
                    }
                        break;
                    case LAErrorUserFallback: {
                        
                        NSLog(@"用户选择输入密码"); // 在TouchID对话框中点击了输入密码按钮
                    }
                        break;
                    case LAErrorSystemCancel: { NSLog(@"取消授权,如其他应用切入,用户自主"); // TouchID对话框被系统取消,例如按下电源键
                    }
                        break;
                    case LAErrorPasscodeNotSet: {
                        NSLog(@"设备系统未设置密码");
                    }
                        break;
                    case LAErrorBiometryNotAvailable: {
                        
                        NSLog(@"设备未设置Touch ID");
                    }
                        break;
                    case LAErrorBiometryNotEnrolled:  {
                        
                        NSLog(@"用户未录入指纹");
                    }
                        break;
                    case LAErrorAppCancel: {
                        NSLog(@"用户不能控制情况下APP被挂起");
                    }
                        break;
                    case LAErrorInvalidContext: {
                        
                        NSLog(@"LAContext传递给这个调用之前已经失效");
                    }
                        break;
                    default: {
                        NSLog(@"其他情况");
                    }
                        break;
                }
            }
        });
    }];
}

方式二

/// 方式二
+ (void)fingerprintIdentificationWithContext2:(LAContext *)context {
    
    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"验证指纹以确认您的身份" reply:^(BOOL success, NSError *error) {
        
        // 切换到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            
            if (success) {
                NSLog(@"指纹验证成功");
            } else {
                NSLog(@"指纹认证失败,%@",error.description);
                NSLog(@"%ld", (long)error.code);
                // 错误码 error.code
                switch (error.code) {
                    case LAErrorAuthenticationFailed:{
                        NSLog(@"授权失败"); // 连续三次指纹识别错误
                    }
                        break;
                    case LAErrorUserCancel: { NSLog(@"--用户取消验证Touch ID");// 在TouchID对话框中点击了取消按钮或者按了home键
                    }
                        break;
                    case LAErrorUserFallback: {
                        
                        NSLog(@"用户选择输入密码"); // 在TouchID对话框中点击了输入密码按钮,在这里可以做一些自定义的操作。
                    }
                        break;
                    case LAErrorSystemCancel: { NSLog(@"取消授权,如其他应用切入,用户自主"); // TouchID对话框被系统取消,例如按下电源键
                    }
                        break;
                    case LAErrorPasscodeNotSet: {
                        NSLog(@"设备系统未设置密码");
                    }
                        break;
                    case LAErrorBiometryNotAvailable: {
                        
                        NSLog(@"设备未设置Touch ID");
                    }
                        break;
                    case LAErrorBiometryNotEnrolled:  {
                        
                        NSLog(@"用户未录入指纹");
                    }
                        break;
                    case LAErrorBiometryLockout: {
                        // 连续五次指纹识别错误,TouchID功能被锁定,下一次需要输入系统密码
                        NSLog(@"Touch ID被锁,需要用户输入系统密码解锁");
                        // 往本地用户偏好设置里把touchIdIsLocked标识设置为yes,表示指纹识别被锁
                        [[NSUserDefaults standardUserDefaults] setObject:@(YES)forKey:@"touchIdIsLocked"];
                        [[NSUserDefaults standardUserDefaults] synchronize];
                        [ASFingerprintIdentification touchIdIsLockedWithContext:context];
                    }
                        break;
                    case LAErrorAppCancel: {
                        NSLog(@"用户不能控制情况下APP被挂起");
                    }
                        break;
                    case LAErrorInvalidContext: {
                        
                        NSLog(@"LAContext传递给这个调用之前已经失效");
                    }
                        break;
                    default: {
                        NSLog(@"其他情况");
                    }
                        break;
                }
            }
        });
    }];
}

指纹验证被锁后调用输入密码解锁

/// 指纹验证被锁后调用输入密码解锁
+ (void)touchIdIsLockedWithContext:(LAContext *)context {
    
    [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"验证密码" reply:^(BOOL success, NSError * _Nullable error) {
        
        if (success) {
            
            NSLog(@"验证成功");
            // 把本地标识改为NO,表示指纹解锁解除锁定
            [[NSUserDefaults standardUserDefaults] setObject:@(NO) forKey:@"touchIdIsLocked"];
            [[NSUserDefaults standardUserDefaults] synchronize];
            
        }else{
            
            NSLog(@"验证失败");
        }
    }];
}

Demo

相关文章

网友评论

    本文标题:指纹识别

    本文链接:https://www.haomeiwen.com/subject/hnvdvhtx.html