美文网首页
iOS Touch ID

iOS Touch ID

作者: 白公子是猫奴 | 来源:发表于2017-05-22 10:51 被阅读0次

    iOS Touch ID

    支持系统和机型

    iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论上第三方软件不可使用。

    依赖框架

    LocalAuthentication.framework

    # import <LocalAuthentication/LocalAuthentication.h>
    

    注意事项

    iOS 8以下版本适配时,务必进行API验证,避免调用相关API引起崩溃。

    使用类

    LAContext 指纹验证操作对象

    代码如下

    - (void)authenticateUser
    {
        //初始化上下文对象
        LAContext* context = [[LAContext alloc] init];
        //错误对象
        NSError* error = nil;
        NSString* result = @"Authentication is needed to access your notes.";
        
        //首先使用canEvaluatePolicy 判断设备支持状态
        if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
            //支持指纹验证
            [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError *error) {
                if (success) {
                    //验证成功,主线程处理UI
                }
                else
                {
                    NSLog(@"%@",error.localizedDescription);
                    switch (error.code) {
                        case LAErrorSystemCancel:
                        {
                            NSLog(@"Authentication was cancelled by the system");
                            //切换到其他APP,系统取消验证Touch ID
                            break;
                        }
                        case LAErrorUserCancel:
                        {
                            NSLog(@"Authentication was cancelled by the user");
                            //用户取消验证Touch ID
                            break;
                        }
                        case LAErrorUserFallback:
                        {
                            NSLog(@"User selected to enter custom password");
                            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                //用户选择输入密码,切换主线程处理
                            }];
                            break;
                        }
                        default:
                        {
                            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                               //其他情况,切换主线程处理 
                            }];
                            break;
                        }
                    }
                }
            }];
        }
        else
        {
            //不支持指纹识别,LOG出错误详情
            
            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);
        }
    }
    
    

    操作流程

    首先判断系统版本,iOS 8及以上版本执行
    -(void)authenticateUser方法,方法自动判断设备是否支持和开启Touch ID。

    • 第一步我们需要判定系统版本,如果不支持,我们直接返回,即可
    if ([UIDevice currentDevice].systemVersion.floatValue < 8.0) {
           [self inputUserInfo];
          return;
     }
     
    
    • 第二步,判断手机是否支持指纹识别,我们要使用到一个LAContext类
     //创建LAContext
      LAContext *ctx = [[LAContext alloc] init];
         // 判断设备是否支持指纹识别
      if ([ctx canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:NULL]) {
        
            //识别代码部分
    }
    
    • 第三步,在第二步的“识别代码部分”填写正经的识别代码
     //创建LAContext
        LAContext *ctx = [[LAContext alloc] init];
         // 判断设备是否支持指纹识别
        if ([ctx canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:NULL]) {
         
            NSLog(@"请按手指");
            
            // 输入指纹 - 回调是异步的
            [ctx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"提示文字" reply:^(BOOL success, NSError *error) {
                
                
                // 1. 如果输入成功
                if (success) {
                    //成功
                } else {
                    // 判断错误类型是否是主动自行输入密码
                    if (error.code == LAErrorUserFallback) {
                        dispatch_async(dispatch_get_main_queue(), ^{
                             //密码验证方法
                         });
                     }
                 }
             }];
         } else {
             
             //密码验证方法
         }
    

    iOS 9

     // Authentication was not successful, because there were too many failed Touch ID attempts and
        // Touch ID is now locked. Passcode is required to unlock Touch ID, e.g. evaluating
        // LAPolicyDeviceOwnerAuthenticationWithBiometrics will ask for passcode as a prerequisite.
        LAErrorTouchIDLockout   NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorTouchIDLockout,
    
        // Authentication was canceled by application (e.g. invalidate was called while
        // authentication was in progress).
        LAErrorAppCancel        NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,
    
        // LAContext passed to this call has been previously invalidated.
        LAErrorInvalidContext   NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext
    

    其中,LAErrorTouchIDLockout是在8.0中也会出现的情况,但并未归为单独的错误类型,这个错误出现,源自用户多次连续使用Touch ID失败,Touch ID被锁,需要用户输入密码解锁,这个错误的交互LocalAuthentication.framework已经封装好了,不需要开发者关心。

    LAErrorAppCancelLAErrorSystemCancel相似,都是当前软件被挂起取消了授权,但是前者是用户不能控制的挂起,例如突然来了电话,电话应用进入前台,APP被挂起。后者是用户自己切到了别的应用,例如按home键挂起。

    LAErrorInvalidContext很好理解,就是授权过程中,LAContext对象被释放掉了,造成的授权失败。

    相关文章

      网友评论

          本文标题:iOS Touch ID

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