指纹识别验证和人脸识别验证-IOS

Categories: IOS

本文代码是基于Swift4.2。

TouchID和FaceID的验证,在IOS中调用本身比较简单。因为现在要么是FaceID,要么是TouchID,再老一点的就是啥都没有。这种机器应该没人用了吧?不过还有是IOS系统版本的支持。TouchID是从IOS8.0开始的,FaceID是从IOS11.0开始的。

引入模块,初始化环境

要使用验证模块先要引入:

import LocalAuthentication

然后初始化对象:

let context = LAContext.init()

判断验证方式

从IOS11.0开始,也就是出了iPhoneX之后就有了FaceID了,所以就要判断下当前设备使用的是什么验证方式,TouchID或者FaceID。 biometryType 这个属性就代表了当前设备的验证方式。不过这个属性的值一开始是没有的,必须先执行一个canEvaluatePolicy的方法,成功之后也就是说当前设备有支持的验证方式并且已经开启使用了的情况下,才会设置,这时候通过判断biometryType的值就知道当前设备使用的验证方式是啥了。 判断代码:

if #available(iOS 8.0, *) {
            let context = LAContext.init()
            //判断是否有生物识别功能
            if(context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: nil)){
                if #available(iOS 11.0, *) {
                    switch(context.biometryType) {
                    case LABiometryType.faceID:
                        //人脸识别
                        break
                    case LABiometryType.touchID:
                        //指纹识别
                        break
                    case LABiometryType.none:
                        //没有生物识别功能
                        break
                    }
                }else {
                    // IOS11之前只能是指纹识别
                }
            }else{
                // 判断没有通过可能是没有开启或者设备不支持
            }
        }else {
            // IOS8之前没有生物识别
        }

使用

使用方式也是一样,首先判断是否有识别功能,然后开始验证。 代码:

     if #available(iOS 8.0, *) {
                let context = LAContext.init()
                //这个localizedFallbackTitle是指纹识别第一次失败后会出现的用户自定义处理的按钮名称
                context.localizedFallbackTitle = "其它方式"
                if(context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: nil)){
                // 这里就是执行指纹验证或者人脸识别的,会弹出一个对话框等待验证
                //localizedReason 是对话框中显示的文字内容,说明当前验证的原因
                    context.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason, reply: { (success, error) in
                        if success {
                            DispatchQueue.main.async {
                                //表示验证成功
                            }
                        }else {
                            if error != nil && error is LAError {
                                let code = (error as! LAError).code
                                // 这里的code有很多情况
                                switch code {
                                case LAError.userCancel:
                                    // 用户点击了取消按钮
                                    break
                                case LAError.userFallback:
                                    // 用户点击了自定义处理的按钮
                                    break
                                case LAError.appCancel:
                                    // 应用取消
                                    break
                                case LAError.authenticationFailed:
                                   //认证失败
                                    break
                                case LAError.biometryLockout:
                                    //生物识别功能锁定,一般是验证错误次数超过5次
                                    break
                                case LAError.biometryNotAvailable:
                                    //设备不支持
                                    break
                                case LAError.biometryNotEnrolled:
                                    // 未启用生物识别功能
                                    break
                                case LAError.invalidContext:
                                    // context失效
                                    break
                                case LAError.passcodeNotSet:
                                    //系统没有设置密码,所以无法启用生物识别验证
                                    break
                                case LAError.systemCancel:
                                    //系统取消了验证,有可能是其他应用到前台了
                                    break
                                }
                            }else {
                                //        其他异常                   
                            }
                        }
                    })
                }else {
                    DispatchQueue.main.async {
                        //设备不支持或者未开启生物识别验证功能
                    }
                }
            }else {
                DispatchQueue.main.async {
                    //IOS8以前的系统不支持
                }
            }

没有人脸识别的手机,这是指纹识别的的时候显示的对话框。 IMG_0851

如果第一次识别不成功,会多出一个按钮,开发者可以提供其它的验证方式。点击了其它方式按钮就是返回上面代码中说的LAError.userFallback的错误代码 IMG_0852