美文网首页
TouchID 指纹识别

TouchID 指纹识别

作者: 为什么划船不靠桨 | 来源:发表于2017-12-20 10:27 被阅读0次
    指纹识别

    TouchID 指纹识别是iPhone 5s设备新增的一项重大功能,用于数据加密和安全。而在IOS 8.0 以后也向第三方开放了相应功能API,我们可以利用这个API做相应的用户验证和登录的功能,省去输入密码的环节,提高登录的用户体验。
    在app中集成指纹识别是跟系统解锁iPhone用的一套指纹识别,就是说假如在app中指纹识别错误了5次(iOS 系统默认指纹识别错误5次后,指纹识别会被判定为无效状态),那么不仅app中的指纹识别系统是无效的,系统的iPhone指纹识别解锁系统也是无效的,必须输入iPhone解锁口令码验证之后,指纹识别才会被系统重新判别为有效!

    我在这里说下指纹登录的流程:

    在设备第一次使用指纹登录之前,必须先登录原有的账号
    在密码管理中,点击开启“指纹登录”;
    验证TouchID:检测当前设备是否支持TouchID,若支持则发起TouchID验证;
    生成设备账号/密码:TouchID验证通过后,根据当前已登录的账号和硬件设备Token,生成设备账号/密码(规则可自定,密码要长要复杂),并保存在keychain;
    绑定:生成设备账号/密码后,将原账号及设备账号/密码,加密后(题主使用的是RSA加密)发送到服务端进行绑定;
    成功:验证原账号及设备账号有效后,返回相应状态,绑定成功则完成整个TouchID(设备)绑定流程。

    设备(指纹)登陆
    在设备(用户)绑定之后,并且用户账号退出后,可以使用指纹登录,若当前设备未绑定,则不会出现“指纹登录”按钮
    TouchID登录:在用户登录界面,点击“指纹登录”;
    验证TouchID:检测当前设备是否支持TouchID,若支持则发起TouchID验证;
    登录:读取app在本机的设备账号/密码,调用设备登录接口,发起登录请求;
    成功:验证设备账号/密码后,返回相应状态,登录成功则完成整个TouchID登录流程。
    *在设备(用户)绑定之后,并且当前正处于登录状态,也可以将本设备取消绑定,流程基本与绑定流程雷同,不再重复。

    具体用法如下:

    导入头文件

    #import <LocalAuthentication/LocalAuthentication.h>
    

    使用LocalAuthentication中的LAContext.h和LAError.h两个头文件,LAError.h提供错误码

    初始化LAContext对象(创建安全验证对象)
    LAContext *context = [[LAContext alloc] init];
    
    LAPolicy这个属性是一个枚举,它提供两个值:

    LAPolicyDeviceOwnerAuthenticationWithBiometrics是生物指纹识别。支持iOS 8以上系统,使用该设备的TouchID进行验证,当输入TouchID验证5次失败后,TouchID被锁定,只能通过锁屏后解锁设备时输入正确的解锁密码来解锁TouchID。验证弹框有两个按钮,第一个是取消按钮,第二个按钮可以自定义标题名称(默认是"输入密码")。只有在第一次指纹验证失败后才会出现第二个按钮,这种鉴定方式的第二个按钮的功能自定义,第二个按钮的功能不做处理的话不会有任何响应。
    LAPolicyDeviceOwnerAuthentication是生物指纹识别或系统密码验证。支持iOS9以上系统,对于8.0系统的手机不能使用。如果TOUCH ID 可用,且已经录入指纹,则优先调用指纹验证。其次是调用系统密码验证,如果没有开启设备密码,则不可以使用这种验证方式。指纹识别验证失败三次将自动弹出设备密码输入框,如果不进行密码输入。再次进来还可以有两次机会验证指纹,如果都失败则TOUCH ID被锁住。以后也只能弹出设备密码输入框。补充:值得注意的是在iOS9系统中,前三次验证失败会自动弹出密码验证框,后两次验证失败后不会自动弹出密码验证框。而在iOS 10系统中,前三次验证失败或者后两次验证失败,都会自动弹出密码验证框。

    看下两种验证方式在各系统中的执行情况

    LAPolicyDeviceOwnerAuthenticationWithBiometrics

    iOS8系统:
         在只有口令密码的情况下打印结果:NSLog(@"指纹识别无效%@",error.localizedDescription);
         在只有指纹的情况下打印结果: NSLog(@"指纹识别无效%@",error.localizedDescription);
         在没有口令也没有指纹的情况下打印结果:NSLog(@"指纹识别无效%@",error.localizedDescription);
         
         iOS9系统:
         在只有口令密码的情况下打印结果:NSLog(@"指纹识别无效%@",error.localizedDescription);
         在只有指纹的情况下打印结果: NSLog(@"指纹识别无效%@",error.localizedDescription);
         在没有口令也没有指纹的情况下打印结果:NSLog(@"指纹识别无效%@",error.localizedDescription);
         
         iOS10系统:
         在只有口令密码的情况下打印结果:NSLog(@"指纹识别无效%@",error.localizedDescription);
         在只有指纹的情况下打印结果: NSLog(@"指纹识别无效%@",error.localizedDescription);
         在没有口令也没有指纹的情况下打印结果:NSLog(@"指纹识别无效%@",error.localizedDescription);
         分析可知,在LAPolicyDeviceOwnerAuthenticationWithBiometrics下必须系统口令码和指纹同时是存在的,才会判定指纹系统是可用的。
    

    LAPolicyDeviceOwnerAuthentication

    iOS9系统:
         在只有口令密码的情况下打印结果:NSLog(@"指纹识别有效");
         在只有指纹的情况下打印结果: NSLog(@"指纹识别无效%@",error.localizedDescription);
         在没有口令也没有指纹的情况下打印结果:NSLog(@"指纹识别无效%@",error.localizedDescription);
         
         iOS10系统:
         在只有口令密码的情况下打印结果:NSLog(@"指纹识别有效");
         在只有指纹的情况下打印结果: NSLog(@"指纹识别无效%@",error.localizedDescription);
         在没有口令也没有指纹的情况下打印结果:NSLog(@"指纹识别无效%@",error.localizedDescription);
         综合iOS9、iOS10在policy:LAPolicyDeviceOwnerAuthentication下的表现,只要开启了系统口令码,就判定指纹系统可用,更加印证了 如果没有开启设备密码,则不可以使用这种验证方式。
    
    官方API仅提供TouchID的支持状态和验证状态:

    canEvaluatePolicy
    监测设备是否支持TouchID,返回BOOL,并且若不支持,则在error里面返回相应状态
    evaluatePolicy
    监测TouchID验证状态,若验证错误则在block里面返回验证状态和error错误原因

    //localizedCancelTitle自定义取消按钮的文字,支持iOS 10以上系统,
        //localizedFallbackTitle验证TouchID时弹出Alert的输入密码按钮的标题,设置这个属性后,取消按钮旁边会多一个按钮,可在调起TouchID时,调用其他功能,内容为空时不显示。
        //localizedFallbackTitle=@“”,不会出现“输入密码”按钮
    //    context.localizedFallbackTitle = @"";
        //    context.localizedCancelTitle = @"22";
    
        //错误对象
        NSError *error = nil;
        NSString *result = @"请验证已有指纹";
        
        //判断支持 touch ID
        if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
    
            //可以调用 touch ID
            [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError *error) {
    
                if (success) {
                    
                    NSLog(@"touch ID 正确,回主线程刷新UI");
                    dispatch_async(dispatch_get_main_queue(), ^{
                        
                        [self dismissViewControllerAnimated:YES completion:nil];
                    });
                }else{
    
                    if(error.code == LAErrorBiometryLockout) {
    
                        NSLog(@"连续五次指纹识别错误,TouchID功能被锁定,下一次需要输入系统密码");
                    }else if(error.code == LAErrorAppCancel) {
    
                        NSLog(@"认证被取消了由用户(例如了取消按钮");
                    }else if(error.code == LAErrorInvalidContext) {
    
                        NSLog(@"LAContext传递给这个调用之前已经失效(请求验证出错)");
                    }else if(error.code == LAErrorAuthenticationFailed) {
    
                        NSLog(@"连续三次指纹识别错误");
                    }else if (error.code == LAErrorUserFallback){
    
                        NSLog(@"用户选择输入密码,切换主线程处理");
                        
                    }else if (error.code == LAErrorSystemCancel){
    
                        NSLog(@"身份验证被系统取消了(如另一个应用程序去前台)。");
                    }else if (error.code == LAErrorPasscodeNotSet){
    
                        NSLog(@"设备系统未设置密码");
                    }else if (error.code == LAErrorBiometryNotAvailable){
    
                        NSLog(@"设备未设置Touch ID,因为设备上无法使用Touch ID。");
                    }else if (error.code == LAErrorBiometryNotEnrolled){
    
                        NSLog(@"用户未录入指纹");
                    }else  if (error.code == LAErrorUserCancel){
                        NSLog(@"用户点击了取消----退出程序或者换登录方式");
                    }else{
                        NSLog(@"原因未知");
                    }
                }
    
            }];
        }else{
    
            NSLog(@"👌连续五次指纹识别错误,TouchID功能被锁定,只能输入系统密码啦");
            
            //不支持touch ID  ,只能用密码了
            if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
                [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:result reply:^(BOOL success, NSError * _Nullable error) {
                    
                    if (success) {
                        NSLog(@"---系统密码正确");
                    }else{
                        NSLog(@"---系统密码错误 5次后,要延迟等待时间了");
                    }
                }];
                
            }else{
                NSLog(@"调起账号密码页面失败!!!(原因可能是没有锁屏密码)");
            }
        }
    

    相关文章

      网友评论

          本文标题:TouchID 指纹识别

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