ios8指纹识别

简介

苹果从iPhone5S开始,具有指纹识别技术,从iOS8.0之后苹果允许第三方 App 使用 Touch ID进行身份验证。指纹识别Touch ID提供3+2共5次指纹识别机会(3次识别失败后,弹出的指纹验证框会消失,同时会报错code = -1,然后点击指纹会再次弹框可验证两次),如果五次指纹识别全部错误,就需要手动输入数字密码,数字密码可以输入6次,如果6次输入的数字密码都错误,系统会停止验证,一定的间隔后才能再次输入密码验证,而且间隔会随着输入的次数增长。

使用方法

1.首先导入框架LocalAuthentication
2.判断系统版本,最低iOS 8.0
3.创建验证对象上下文LAContext
4.判断指纹识别技术是否可用canEvaluatePolicy
5.如果可用,开始调用方法开始使用指纹识别

#import <LocalAuthentication/LocalAuthentication.h>
//指纹按钮
- (void)showFingerprintTouch
{
    //系统支持,最低iOS 8.0
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0)
    {
        LAContext * context = [[LAContext alloc] init];
        NSError * error;
        if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])
        {

            //localizedReason: 指纹识别出现时的提示文字
            [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指纹解锁" reply:^(BOOL success, NSError * _Nullable error) {

                if (success)
                {
                    //识别成功
                    dispatch_async(dispatch_get_main_queue(), ^{
                            //在主线程中,处理 ......
                    });
                }
                else if (error)
                {
                    NSLog(@"LAPolicyDeviceOwnerAuthenticationWithBiometrics -- %@",error);
                }

            }];

        }
        else if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:nil])
        {
            [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"密码解锁" reply:^(BOOL success, NSError * _Nullable error){

                NSLog(@"LAPolicyDeviceOwnerAuthentication -- %@", error);

            }];
        }
        NSLog(@" --- %@ ", error);
    }
}


代码解析

指纹识别的策略

[context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil] [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:nil]

  • LAPolicyDeviceOwnerAuthenticationWithBiometrics ,指纹授权使用, 当设备不具有Touch ID的功能,或者在系统设置中没有设置开启指纹,授权将会失败。当指纹验证3+2次都没有通过的时候指纹验证就会被锁定,就需要先进行数字密码的解锁才能继续使用指纹密码。
  • LAPolicyDeviceOwnerAuthentication,指纹和数字密码的授权使用,当指纹可用且没有被锁定,授权后会进入指纹密码验证。不然的话会进入数字密码验证的页面。当系统数字密码没有设置不可用的时候,授权失败。如果数字密码输入不真确,连续6次输入数字密码都不真确后,会停用鉴定过一定的间隔后才能使用,间隔时间依次增长,如图:


  • 弹出的指纹验证框的两个按钮的标题,可以通过下面的方法修改:
    context.localizedCancelTitle = @"取消"; context.localizedFallbackTitle = @"输入密码";
  • localizedReason:是用来设置弹出框的提示内容的,一般写的是是用原因,如图:

     

     
     
     
     
    //详细介绍

    //创建LAContext(指纹验证操作对象)

        LAContext *context = [LAContext new];

        

        //这个属性是设置指纹输入 失败 之后的弹出框的选项

        context.localizedFallbackTitle = @"没有忘记密码";

        

        NSError *error = nil;

    //    使用canEvaluatePolicy  ,判断设备支持状态

        if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {

            NSLog(@"支持指纹识别");

            [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请按home键指纹解锁" reply:^(BOOL success, NSError * _Nullable error) {

                if (success) {

                    NSLog(@"验证成功 刷新主界面");

                }else{

                    NSLog(@"错误:%@",error.localizedDescription);

                    switch (error.code) {

                        case LAErrorSystemCancel:

                        {

                            NSLog(@"系统取消授权,如其他APP切入");

                            break;

                        }

                        case LAErrorUserCancel:

                        {

                            NSLog(@"用户取消验证Touch ID");

                            break;

                        }

                        case LAErrorAuthenticationFailed:

                        {

                            NSLog(@"授权失败");

                            break;

                        }

                        case LAErrorPasscodeNotSet:

                        {

                            NSLog(@"系统未设置密码");

                            break;

                        }

                        case LAErrorTouchIDNotAvailable:

                        {

                            NSLog(@"设备Touch ID不可用,例如未打开");

                            break;

                        }

                        case LAErrorTouchIDNotEnrolled:

                        {

                            NSLog(@"设备Touch ID不可用,用户未录入");

                            break;

                        }

                        case LAErrorUserFallback:

                        {

                            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                                NSLog(@"用户选择输入密码,切换主线程处理");

                            }];

                            break;

                        }

                        default:

                        {

                            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                                NSLog(@"其他情况,切换主线程处理");

                            }];

                            break;

                        }

                    }

                }

            }];

        }else{

            NSLog(@"不支持指纹识别");

            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;

                }

            }

            

            NSLog(@"%@",error.localizedDescription);

        }

 



posted @ 2016-11-23 09:11  Da雪山  阅读(821)  评论(0编辑  收藏  举报