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

最近学习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

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

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

(0)

相关推荐

  • Swift算法之二叉树实现的方法示例

    一.概述 二叉树的结构一般是以二叉链表的形式来存储的.二叉链表的结构类似于双向链表,二叉链表的节点也是有两个结点指针的,一个指向左子树,一个指向右子树.二叉树主要有四种遍历方式:先序遍历.中序遍历.后序遍历.层次遍历.关于二叉树的内容网上有很多,这里不再做过多的陈述. 本文将用Swift去实现二叉树的创建.四种遍历方式等.下面的实现部分内容参考了青玉伏案和唐巧两位大神相关的文章. 二.实现思路及代码 以下面二叉树为例: 先序遍历:先遍历根节点然后再遍历左子树,最后遍历右子树. 故上面先序遍历的顺

  • swift 隐式可选型实例详解

    1.隐式可选型的基本使用 var errorMessage: String? = nil errorMessage = "Not Found" "The message is " + errorMessage! 隐式可选型的定义 var errorMessage: String! = nil errorMessage = "Not Found" "The message is " + errorMessage 隐式可选型不需要

  • iOS中关于Swift UICollectionView横向分页的问题

    下面通过图文并茂的形式给大家介绍UICollectionView横向分页的问题,具体内容详情如下所示: 情况 直接看图 滚前 滚后 已经设置collectionView的isPagingEnabled为true了,可是出现了这种情况,原因就是collectionView的contentSize不够. <UICollectionView: 0x7fc565076000; frame = (0 0; 375 197); clipsToBounds = YES; gestureRecognizers

  • Swift学习笔记之元组(tuples)

    元组 元组(tuples)是由其它类型组合而成的类型.元组可能包含零或多个类型,比如 字符串.整数.字符.布尔以及其它元组.同时请注意,元组是值传递,而不是引用. 在Swift中创建元组的方式很简单,元组类型是用括号包围,由一个逗号分隔的零个或多个类型的列表.例如: let firstHighScore = ("Mary", 9001) 另外,在创建元组时你还可以给元组中的元素命名: let secondHighScore = (name: "James", sco

  • Swift中字典与JSON转换的方法

    Swift中经常会遇到字典和字符串的相互转换,因此可以转换可以封装起来,转换代码如下: func convertStringToDictionary(text: String) -> [String:AnyObject]? { if let data = text.data(using: String.Encoding.utf8) { do { return try JSONSerialization.jsonObject(with: data, options: [JSONSerializat

  • swift guard关键字详解及使用

    swift guard关键字详解及使用 Swift提供guard关键字,guard关键字可以简化繁琐的判断逻辑 func buy( money: Int , price: Int , capacity: Int , volume: Int){ if money >= price{ if capacity >= volume{ print("I can buy it!") print("\(money-price) Yuan left.") print(&

  • Swift算法之栈和队列的实现方法示例

    一.概述 栈和队列在数据结构中是比较重要的一个数据结构. 其实对于栈和队列并不需要太深入的介绍,栈和队列的核心内容是栈是先进后出.队列是先进先出.在实际开发中有些场景也可能会用到,比如 APP 中用户可以撤销操作,比如下棋 APP 中的悔棋操作,返回上一步就是先进后出(后进先出),也就是栈的特性. 比如在售票 APP 中,为先下订单的用户先出票,就需要用到队列.当然这两个只是在简单场景下的情况,实际开发中情况可能更复杂,比如售票 APP 为会员用户优先出票等. 接下来就通过 Swift 去实现栈

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

    最近学习swift3.0, 不忙的时候开始用 Swift 重写现有的项目,有些地方的写法变得让人不知道怎么写了,今天就分享一下我在重写 指纹解锁工具类的时候遇到的一些问题吧. 先展示一下成果 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() TouchIdManager.touchIdWithHand(fallBackTitle: "", succeed:

  • swift3.0 创建sqlite数据库步骤方法

    一,导入描述文件 1. 2, . 3, 二,写桥接文件sqliteManager 1.文件里写入 #import <sqlite3.h>就可以了 2.把桥接文件添加到编译环境 三, 写数据库管理类(单例) import UIKit class sqliteManager: NSObject { private static let manager: sqliteManager = sqliteManager() //单例 class func shareManager() -> sqli

  • Android指纹解锁方法解析

    我先说说这两种的方式的不同之处吧 第一种: 在调动成功之后 不会让你指纹解锁 而是调转到当初你设置指纹解锁时的 手势解锁页面 第二种: 在调动成功之后,是进行指纹解锁 不调转 你直接把手指放到金属感应环 上面进行指纹验证 大家可以根据需求 自行选择 ok 那就亮代码了 第一种: xml 布局: 一个 文本显示 一个按钮(不解释) MainActivity.java源码 public class MainActivity extends FragmentActivity { Fingerprint

  • iOS实现启动引导页与指纹解锁的方法详解

    前言 应用程序启动时有些会有引导页,目的是用户第一次登录时对应用程序的一些简单了解介绍,一般就是几张轮播图片,当引用程序第一次进入时会跳到引导页,以后不再显示,这时就需要将不是第一次登录的标致flag保存到内存中,推荐用户偏好设置NSUserDefaults,第一直接去取值取这个flag取不到(因为是第一次登录)就跳引导页,然后在引导页进入登录页或者首页时将flag值保存到偏好设置中,以后再进来就可以取到不是第一登录的flag就直接跳过引导页.方式有两种:一种是直接切换UIWindow的根控制器

  • 简单实现iOS指纹解锁(TouchID)

    本文实例为大家分享了iOS指纹解锁的具体代码,供大家参考,具体内容如下 1.首先,引入依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthentication.h> 2.然后,判断系统是否为iOS8及以上 //iOS8.0后才支持指纹识别接口 if ([UIDevice currentDevice].systemVersion.floatValue < 8.0) { return; } 3.最后

  • 使用Swift代码实现iOS手势解锁、指纹解锁实例详解

    一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeedsDisplay,这样就会自动调用drawRect方法). 1.3.当手指在屏幕上滑动时,调用重写的touchesEnded:withEvent方法. 这两个方法执行的操作是一样的:通过locationInView获取 触摸的坐标,然后用 CGRectContainsPoint 判断手指是否经过UIB

  • iOS 指纹解锁验证TouchID功能

    1.首先,引入依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthentication.h> 2.然后,判断系统是否为iOS8及以上 //iOS8.0后才支持指纹识别接口 if ([UIDevice currentDevice].systemVersion.floatValue < 8.0) { return; } 3.最后,在APP启动时调用以下方法即可完成指纹解锁的全部功能集成 - (voi

  • 浅谈Android 指纹解锁技术

    什么是指纹解锁技术 根据人的指纹来验证是否能够解锁的技术,类似于通过输入密码来解锁,都是通过一定的数字特征来解锁. 指纹解锁技术原理理解 首先说明每个人的每个指纹信息都是独一无二的,皮肤纹路在图案,断点,交叉点上各不相同,通过光学感应读出指纹的图片信息也是独一无二的. 先保存一个人的指纹特征(图片信息根据算法生成的数据),然后再使用时利用这个人的这个指纹特征去和先前保存的指纹特征做对比,对比一致则解锁成功,对比不一致则解锁失败,对比结果并不是100%一样,而可以按照一个比例来判定,比如90%一样

  • IOS swift3.0 下闭包语法整理

    IOS swift3.0 下闭包语法整理 一.闭包的概念 有oc基础的都知道,闭包其实是oc里面的block,语法格式不一样,但作用是一样的.主要是用于callBack(异步回调)或者两个类之间的通信.它的本质一个函数,一个可执行的代码块,只是这个函数是没有名字的,也就是匿名函数.你也可以把他看作如 int.float一样,是一种数据类型,一种可以作为参数传递的数据类型. 二.基本语法 1.闭包的声明 //定义一个求和闭包 //闭包类型:(Int,Int)->(Int) let add:(Int

  • 浅析IOS开发TouchID指纹解锁功能

    效果图如下 实现过程 1.首先引入指纹解锁必须的头文件 #import <LocalAuthentication/LocalAuthentication.h> 2.了解下主要的两个方法 这个方法是判断设备是否支持TouchID的. - (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none))); 这个是用来验证TouchI

随机推荐