swift3.0指纹解锁的实现方法

发布时间 - 2026-01-11 00:23:42    点击率:

最近学习swift3.0, 不忙的时候开始用 Swift 重写现有的项目,有些地方的写法变得让人不知道怎么写了,今天就分享一下我在重写 指纹解锁工具类的时候遇到的一些问题吧。

先展示一下成果

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    TouchIdManager.touchIdWithHand(fallBackTitle: "", succeed: { 
      print("解锁成功")
    }) { (error) in
      print(error.localizedDescription) 
    }

    print(TouchIdManager.IsSupportTouchID)

  }
}

import LocalAuthentication
class TouchIdManager {

  /// 指纹解锁
  ///
  /// - Parameters:
  ///  - fallBackTitle: Allows fallback button title customization. A default title "Enter Password" is used when
  ///       this property is left nil. If set to empty string, the button will be hidden
  ///  - succeed: 解锁成功的回调
  ///  - failed: 解锁失败的回调
  class func touchIdWithHand(fallBackTitle: String?, succeed: @escaping () -> (), failed: @escaping (_ error: LAError) -> ()) {

    guard self.IsSupportTouchID else {
      print("设备不支持TouchID 或未开启TouchID ")
      return
    }

    let context = LAContext()
    context.localizedFallbackTitle = fallBackTitle
    let reason = "验证指纹,完成支付"
    context.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason, reply: { (isSuccess, err) in

      OperationQueue.main.addOperation({

        guard isSuccess == true, err == nil else {
          let laerror = err as! LAError
          failed(laerror)
//          switch laerror.code {
//          case LAError.authenticationFailed: 
//            print("连续三次输入错误,身份验证失败。")
//          case LAError.userCancel: 
//            print("用户点击取消按钮。")
//          case LAError.userFallback: 
//            print("用户点击输入密码。")
//          case LAError.systemCancel: 
//            print("系统取消")
//          case LAError.passcodeNotSet: 
//            print("用户未设置密码")
//          case LAError.touchIDNotAvailable: 
//            print("touchID不可用")
//          case LAError.touchIDNotEnrolled: 
//            print("touchID未设置指纹")
//          default: break
//          }

          return
        }
        succeed()
      })
    })
  }

  /// 检查手机 TouchID 功能是否开启或可以使用
  class var IsSupportTouchID: Bool {
    get {
      let context = LAContext()
      var error :NSError?
      let isSupport = context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error)
      return isSupport
    }
  }  
}

在实现的时候主要遇到的问题是, 对 evaluatePolicy 方法中回调的 Error 值的处理;
方法定义:
func evaluatePolicy(_ policy: LAPolicy, localizedReason: String, reply: @escaping (Bool, Error?) -> Swift.Void)

由于swift对参数类型严格校验,而 Error 是一个协议,它并没有 Error.code 的值来跟各种错误类型来对应;
swift 2 中,我在这一块是这么写的

switch LAError(rawValue: error!.code) {

          case .Some(LAError.AuthenticationFailed):
            print("连续三次输入错误,身份验证失败。")
          case .Some(LAError.UserCancel):
            print("用户点击取消按钮。")
          case .Some(LAError.UserFallback):
            print("用户点击输入密码。")
          case .Some(LAError.SystemCancel):
            print("系统取消")
          case .Some(LAError.PasscodeNotSet):
            print("用户未设置密码")
          case .Some(LAError.TouchIDNotAvailable):
            print("touchID不可用")
          case .Some(LAError.TouchIDNotEnrolled):
            print("touchID未设置指纹")
          default:
            break
          }

swift3 中取消了这种语法, 但是处理起来更简单了,可以将 Error 直接强转成 LAError 就行了

let laerror = err as! LAError

但是,有个疑问,我要怎么才能最快的知道 需要强转成什么类型呢? 有知道的 谢谢告知!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# swift3.0  # 指纹  # 解锁  # 使用Swift代码实现iOS手势解锁、指纹解锁实例详解  # iOS中Swift指触即开集成Touch ID指纹识别功能的方法  # iOS开发中Swift 指纹验证功能模块实例代码  # Swift利用指纹识别或面部识别为应用添加私密保护功能  # 回调  # 重写  # 转成  # 不可用  # 输入密码  # 身份验证  # 是一个  # 我要  # 让人  # 我在  # 有个  # 在这  # 问题是  # 写了  # 不支持  # 可以使用  # 不知道怎么  # 不忙  # 大家多多 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何在万网自助建站中设置域名及备案?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  成都网站制作公司哪家好,四川省职工服务网是做什么用?  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  如何在IIS中新建站点并配置端口与IP地址?  javascript中对象的定义、使用以及对象和原型链操作小结  公司网站制作价格怎么算,公司办个官网需要多少钱?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  深圳网站制作培训,深圳哪些招聘网站比较好?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel如何为API生成Swagger或OpenAPI文档  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  浅述节点的创建及常见功能的实现  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  中山网站推广排名,中山信息港登录入口?  个人网站制作流程图片大全,个人网站如何注销?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  php 三元运算符实例详细介绍  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  微信小程序 scroll-view组件实现列表页实例代码  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何在万网ECS上快速搭建专属网站?  nginx修改上传文件大小限制的方法  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  如何用搬瓦工VPS快速搭建个人网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在云主机快速搭建网站站点?  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel如何使用Collections进行数据处理?(实用方法示例)  Laravel如何处理CORS跨域请求?(配置示例)  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  javascript中的try catch异常捕获机制用法分析  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  独立制作一个网站多少钱,建立网站需要花多少钱?  如何撰写建站申请书?关键要点有哪些?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  JavaScript中的标签模板是什么_它如何扩展字符串功能  python中快速进行多个字符替换的方法小结  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作