iOS Touch ID 开发教程

一、Touch ID 简介

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

二、依赖框架

LocalAuthentication.framework

三、注意事项

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

if (iOS8) { xxx } // 系统版本验证
if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError])

四、使用类

LAContext指纹验证操作对象

五、操作流程

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

六、代码示例

傻瓜式使用,不需要看懂代码,可直接复制粘贴,然后在注释处加入自己的代码即可,并且OC、Swift两个版本都有。
Objective-C:

- (IBAction)showTouchIDAlert:(id)sender { 
    // 1.判断是否是iOS8之后
    if (!iOS8later) {
        NSLog(@"版本不对不能使用TouchID"); 
        return;
    } 
    // 2.调用touchID的相关方法
    [self authenticateUser];
}
// 鉴定用户
- (void)authenticateUser{  
    // 创建指纹验证对象 
    LAContext *context = [[LAContext alloc] init]; 
    NSError *yfError = nil; 
    // 验证设备是否支持touchID 
    // LAPolicyDeviceOwnerAuthenticationWithBiometrics  iOS8 
    // LAPolicyDeviceOwnerAuthentication  iOS9 
    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&yfError]) { 
        // 支持TouchID 
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"验证你的Touch ID" reply:^(BOOL success, NSError * _Nullable error) { 
            if (success) { 
                // touchID验证成功 
                // 继续处理相关业务(注意线程)
            }  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 { 
        // 不支持TouchID 
        switch (yfError.code) { 
            case LAErrorTouchIDNotEnrolled: 
                NSLog(@"LAErrorTouchIDNotEnrolled"); 
                break; 
            case LAErrorPasscodeNotSet: 
                NSLog(@"LAErrorPasscodeNotSet"); 
                // 此处触发showPasscodeResetAlert方法 
                break; 
            default: 
                NSLog(@"Touch ID is unaviliable"); 
                break; 
        } 
        NSLog(@"%@", yfError.localizedDescription); 
    }
}

Swift:

let context = LAContext()
var err: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &err) {
    context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "验证你的Touch ID", reply: { (isSuccess, error) in
        if isSuccess { // TouchID验证成功
            // 继续处理相关业务(注意线程)
            print("验证成功!", Thread.current)
        } else {
            print("验证失败!", error?.localizedDescription)
            let e = (error as! NSError)
            switch (Int32(e.code)) {
            case kLAErrorSystemCancel:
                print("切换到其他APP,系统取消验证Touch ID")
            case kLAErrorUserCancel:
                 print("用户取消验证Touch ID ")
            case kLAErrorUserFallback:
                  print("用户选择输入密码,切换主线程处理", Thread.current)
                  OperationQueue.main.addOperation {
                      print("主线程处理", Thread.current)
                  }
             default:
                 print("其他情况,切换主线程处理")
                 DispatchQueue.main.async {
                     print("主线程处理", Thread.current)
                 }
             }
        }
    })
}

注意:模拟器调试方法

  1. 如果想在模拟器上调试Touch ID,则需要进行以下模拟器设置

    《iOS Touch ID 开发教程》 开启Touch ID

    只有把这个选项选中,才能进行Touch ID验证。

  2. 匹配OR不匹配Touch ID

    《iOS Touch ID 开发教程》

    原文作者:小道萧兮
    原文地址: https://www.jianshu.com/p/1c65e2861ab5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞