专栏首页小黑娃Henryios swift版touchID&faceIDios swift版touchID&faceID

ios swift版touchID&faceIDios swift版touchID&faceID

FaceID和TouchID本身代码很简单,使用起来也很容易,主要是逻辑的嵌套相对复杂。 状态很多但不是所有状态都需要处理和提示,故没有列出所有枚举

enum LocalAuthStatus : Int {
    case success             //成功
    case failed              //失败
    case passwordNotSet      //未设置手机密码
    case touchidNotSet       //未设置指纹
    case touchidNotAvailable //不支持指纹
    case cancleSys           //系统取消
    case canclePer           //用户取消
    case inputNUm            //输入密码
}

从iOS11开始系统提供了当前设备支持哪种检测。 biometryType该参数返回对应类型,但是必须在canEvaluatePolicy方法之后该参数才有值。 注:支持FaceID的设备出厂最低系统版本就是iOS11.0所以,在iOS11以下只要硬件支持,则只有TouchID一种。

enum BiometryType : Int {
    case none
    case touchID
    case faceID
}
public static func getBiometryType() -> BiometryType{
        //该参数必须在canEvaluatePolicy方法后才有值
        let authContent = LAContext()
        var error: NSError?
        if authContent.canEvaluatePolicy(
        .deviceOwnerAuthenticationWithBiometrics,
        error: &error) {
            //iPhoneX出厂最低系统版本号:iOS11.0.0
            if #available(iOS 11.0, *) {
                if authContent.biometryType == .faceID {
                    return .faceID
                }else if authContent.biometryType == .touchID {
                    return .touchID
                }
            } else {
                guard let laError = error as? LAError else{
                    return .none
                }
                if laError.code != .touchIDNotAvailable {
                    return .touchID
                }
            }
        }
         return .none
    }

官方API已经把UI和交互都封装好了可以直接使用,除了一个字符串剩下的我们都只能看看。我们只需要做好验证成功、异常的处理就可以了。

let authContent = LAContext()
        //如果为空不展示输入密码的按钮
        authContent.localizedFallbackTitle = strTips
        var error: NSError?
        /*
         LAPolicy有2个参数:
         用TouchID/FaceID验证,如果连续出错则需要锁屏验证手机密码,
         但是很多app都是用这个参数,等需要输入密码解锁touchId&faceId再弃用该参数。
         优点:用户在单次使用后就可以取消验证。
         1,deviceOwnerAuthenticationWithBiometrics
         
         用TouchID/FaceID或密码验证, 默认是错误两次或锁定后, 弹出输入密码界面
         等错误次数过多验证被锁时启用该参数
         2,deviceOwnerAuthentication
         
         */
        if authContent.canEvaluatePolicy
        (.deviceOwnerAuthenticationWithBiometrics,
        error: &error) 
        {
       authContent.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
            localizedReason: strTips) {(success,error) in
                if success {
                    //evaluatedPolicyDomainState 只有生物验证成功才会有值
                    if let _ = authContent.evaluatedPolicyDomainState {
                        //如果不放在主线程回调可能会有5-6s的延迟
                        DispatchQueue.main.async {
                            print("验证成功")
                            block(.success, error)
                        }
                    }else{
                        DispatchQueue.main.async {
                            print("设备密码输入正确")
                        }
                    }
                }else{
                    guard let laError = error as? LAError else{
                        DispatchQueue.main.async {
                            print("touchID不可用")
                            block(.touchidNotAvailable,error)
                        }
                        return
                    }
                    switch laError.code {
                    case .authenticationFailed:
                        DispatchQueue.main.async {
                            print("连续三次输入错误,身份验证失败")
                            block(.failed, error)
                        }
                    case .userCancel:
                        DispatchQueue.main.async {
                            print("用户点击取消按钮。")
                            block(.canclePer, error)
                        }
                    case .userFallback:
                        DispatchQueue.main.async {
                            print("用户点击输入密码")
                            block(.inputNUm, error)
                        }
                    case .systemCancel:
                        DispatchQueue.main.async {
                            print("系统取消")
                            block(.cancleSys,error)
                        }
                    case .passcodeNotSet:
                        DispatchQueue.main.async {
                            print("用户未设置密码")
                            block(.passwordNotSet,error)
                        }
                    case .touchIDNotAvailable:
                        DispatchQueue.main.async {
                            print("touchID不可用")
                            block(.touchidNotAvailable,error)
                        }
                    case .touchIDNotEnrolled:
                        DispatchQueue.main.async {
                            print("touchID未设置指纹")
                            block(.touchidNotSet,error)
                        }
                    case .touchIDLockout:
                        DispatchQueue.main.async {
                            print("touchID输入次数过多验证被锁")
                            unlockLocalAuth()
                        }
                    default:break
                    }
                }
            }
        }else{
            print("设备不支持或验证多次后被锁定")
            unlockLocalAuth()
        }
    }
  • 锁定之后需要使用该参数deviceOwnerAuthentication打开设备密码验证通道,否则只能用户手动锁屏后才可以启用检测
private static func unlockLocalAuth() {
        let passwordContent = LAContext()
        var error: NSError?
        if passwordContent.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error){
            passwordContent.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "需要您的密码,才能启用 Touch ID") { (success, err) in
                if success {
                    print("密码解锁成功")
                }else{
                    print(err!)
                    print(error!) } }
        }else{ }}

这就是全部的代码了,可是真正在项目中使用还需要很多逻辑,才是它真正复杂的地方。 至于生物识别在项目中该如何应用,可以去这里看看

iOS-Swift 完整登录方案(touchID&faceID&keychina)一

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS-Swift 完整登录方案(touchID&faceID& keychain)一iOS-Swift 完整登录方案(touchID&faceID& keychain)一

    FaceID和TouchID本身代码很简单,使用起来也很容易,主要是逻辑的嵌套相对复杂。 代码实现篇幅较长,详细的介绍在这ios swift版touchID&...

    用户8893176
  • iOS-Swift 完整登录方案(touchID&faceID&keychain)二iOS-Swift 完整登录方案(touchID&faceID&keychain)二

    包含:用户登录信息、用户个人信息、用户偏好设置、设备信息等等; 其中主要介绍:UserTokenModel、UserInfoModel;

    用户8893176
  • iOS开发常用之代码安全与密码

    GuangdongQi
  • iOS传感器:App前后台切换后,获取敏感信息使用touch ID进行校验1. 指纹识别传感器的用法介绍2. Touch ID指纹识别的代码实现3. 判断系统版本号的几种方法4. App从后台到前台,

    stanbai
  • Face ID和Touch ID 译文and集成篇Face ID和Touch ID

    GuangdongQi
  • 教程 | 用Python实现类FaceID的人脸识别?一文告诉你该怎么做

    选自Medium 作者:Norman Di Palo 机器之心编译 参与:路雪 本文介绍了如何使用 Python 在 Keras 框架上实现 FaceID,对 ...

    机器之心
  • 用 iPhoneX 的 FaceID 刷脸解锁真的靠谱吗?

    原作者 Quincy Larson 编译 Mika 本文为 CDA 数据分析师原创作品,转载需授权 在上周的苹果秋季新品发布会中,苹果推出了全新的脸部识别技...

    CDA数据分析师
  • iOS12、iOS11、iOS10、iOS9常见适配

    Xcode10是默认选中的最新的New Build System(Default),在这个编译系统的环境下,不允许多个info.plist

    conanma
  • WWDC 2017前瞻:硬件细节已遭曝光,但苹果在软件方面的布局却始终慎重

    VRPinea
  • iOS开发常用之开发资源

    GuangdongQi
  • Swift 2.0 简要介绍

    看了很多篇介绍 Swift 2.0 的,感觉 Appcoda 这篇介绍的比较清楚,顺手学习并翻译了一下,英文原文看 这里.

    用户8710806
  • Swift学习资源

    Swift,一种强大的开源编程语言, 让大家都能开发出众的 App。 Swift 是一种强劲而直观的编程语言,它由 Apple 创造,可用来为 iOS、...

    庞小明
  • Swift 2.0 简要介绍

    看了很多篇介绍 Swift 2.0 的,感觉 Appcoda 这篇介绍的比较清楚,顺手学习并翻译了一下,英文原文看 这里.

    用户8710806
  • iOS那些值得参考的App项目源码(GitHub优秀iOS完整项目源码大收录!)

    当然,等初学者成了老司机,或许更喜欢功能单一简单的Demo,因为他们更关注直接跟当前需求挂钩的部分模块,然后最短时间内集成到项目。所以,对于下面完整的项目,如果...

    陈满iOS
  • 窥探Swift系列博客说明及其Swift版本间更新

    Swift到目前为止仍在更新,每次更新都会推陈出新,一些Swift旧版本中的东西在新Swift中并不适用,而且新版本的Swift会添加新的功能。到目前为止,Sw...

    lizelu
  • iOS开发常用之网络、网页

    GuangdongQi
  • iOS开发常用之完整项目加、文章

    GuangdongQi
  • 29.Swift后续学习

    学完前面的语法知识,应该说Swift的语法已经基本讲完,Swift是一门正在走向成熟的年轻语言,每次发布新版本如5.0,5.1都会增加一些新特性,基于Swift...

    YungFan
  • MDM(移动设备管理)国内和国外厂商技术比较差距明显

    最近总有人说国内的MDM和国外MDM差距不大,两者功能半斤八两,实则不然,国内MDM厂商起步较晚,在技术上还无法与国外厂商相媲美,从黑莓时代国外就开始专注MDM...

    人称T客

扫码关注云+社区

领取腾讯云代金券