import UIKit
import LocalAuthentication //指纹识别必须用真机测试,并且在iOS8以上系统,如果是FaceID至少IOS11以上. class AuthenticationTool: NSObject {
let lc = LAContext() func hasTouchID() -> Bool{
if NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0 {
return false
}
/*
在这里简单介绍一下LAPolicy,它是一个枚举.我们根据自己的需要选择LAPolicy,它提供两个值:
LAPolicyDeviceOwnerAuthenticationWithBiometrics和LAPolicyDeviceOwnerAuthentication.
LAPolicyDeviceOwnerAuthenticationWithBiometrics是支持iOS8以上系统,使用该设备的TouchID进行验证,当输入TouchID验证5次失败后,TouchID被锁定,只能通过锁屏后解锁设备时输入正确的解锁密码来解锁TouchID。
LAPolicyDeviceOwnerAuthentication是支持iOS9以上系统,使用该设备的TouchID或设备密码进行验证,当输入TouchID验证5次失败后,TouchID被锁定,会触发设备密码页面进行验证。 */ lc.localizedFallbackTitle = "请输入密码"
var error:NSError!
if lc.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
return false
}
return true
}
typealias TouchIDBlock = (_ result:Dictionary<String, String>) -> Void
var tblock:TouchIDBlock? func authenticationTouchID(block:@escaping TouchIDBlock){
tblock = block
if hasTouchID() { /*context.evaluatedPolicyDomainState用于判断设备上的指纹是否被更改,
在LAContext被创建的时候,evaluatedPolicyDomainState才生效,
可在TouchID验证成功时,将它记录下来,用于下次使用TouchID时校验,提高安全性。
*/ //IOS11之后如果支持faceId也是走同样的逻辑,faceId和TouchId只能选一个 if #available(iOS 9.0, *) {
lc.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "通过验证支持touchID") { (sucess, error) in if sucess{
if let block = self.tblock {
block(["reason":"sucess"])
}
}else{
if let erro = error as NSError?{
var reason = "" if #available(iOS 11.0, *){
switch erro.code { case LAError.biometryNotEnrolled.rawValue:
reason = "TouchID 无法启动,因为用户没有设置TouchID"
default:
reason = "未知原因"
}
}else{ switch erro.code { case LAError.appCancel.rawValue:
reason = "当前软件被挂起并取消了授权 (如App进入了后台等)" case LAError.invalidContext.rawValue:
reason = "当前软件被挂起并取消了授权 (LAContext对象无效)" case LAError.touchIDLockout.rawValue:
reason = "TouchID 被锁定(连续多次验证TouchID失败,系统需要用户手动输入密码"
default:
reason = "未知原因"
}
}
block(["reason":reason])
}
}
}
} else { lc.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "通过验证支持touchID") { (sucess, erro) in
if sucess{
if let block = self.tblock {
block(["reason":"sucess"])
}
}else{
if let erro = erro as NSError?{
var reason = ""
// Fallback on earlier versions switch erro.code { case LAError.authenticationFailed.rawValue:
reason = "TouchID 验证失败" case LAError.passcodeNotSet.rawValue:
reason = "TouchID 无法启动,因为用户没有设置密码" case LAError.systemCancel.rawValue:
reason = "TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等)" case LAError.touchIDNotAvailable.rawValue:
reason = "TouchID 无效" case LAError.userCancel.rawValue:
reason = "TouchID 被用户手动取消" case LAError.userFallback.rawValue:
reason = "用户不使用TouchID,选择手动输入密码" default:
reason = "未知原因"
}
block(["reason":reason])
}
} }
} if let block = tblock {
block(["reason":"nonsupport"])
}
}
}
}

如果想要支持FaceID识别的话,最好加上一个key:NSFaceIDUsageDescription,不加的话,确实也不会崩溃,但我觉得为了保险最好加上,防止以后iOS升级后必须要求该key才能进行FaceID识别,而且我相信按照苹果的尿性,一定会这么做的。

iOS TouchID & FaceID的更多相关文章

  1. iOS - TouchID 指纹识别

    前言 NS_CLASS_AVAILABLE(10_10, 8_0) @interface LAContext : NSObject 指纹识别功能是 iPhone 5s 推出的,SDK 是 iOS 8. ...

  2. [译] iOS 11.4.1 Beta:全新的USB限制模式

    (Source/原文链接 https://blog.elcomsoft.com/2018/06/ios-11-4-1-beta-usb-restricted-mode-has-arrived/) 作者 ...

  3. 170多个Ionic Framework学习资源(转载)

    在Ionic官网找到的学习资源:http://blog.ionic.io/learning-ionic-in-your-living-room/ 网上的文章比较多,但是很多时候我们很难找到自己需要的. ...

  4. iOS12、iOS11、iOS10、iOS9常见适配

    作者:花丶满楼 链接:https://juejin.im/post/5c49a7d0518825254e4d46fc 一.iOS12(Xcode10) 1.1.升级Xcode10后项目报错 不允许多个 ...

  5. iOS 指纹解锁 验证TouchID

    iOS指纹解锁 1.首先,引入依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthenticatio ...

  6. ios --指纹TouchID

    最近在做一套登录系统,包括指纹登录.手势登录以及账号密码登录,在此简单记录一下指纹的处理逻辑. 指纹处理: 1.处理iOS 9.0之后,指纹被锁不会自动弹出密码解锁的情况: 2.处理iOS 10.*系 ...

  7. swift 实现iOS手势密码、指纹密码、faceID

    本博客包含了如何实现iOS手势密码.指纹密码.faceID全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBTouchID,支持swift3. ...

  8. iOS - (个人隐私钱包调用系统本机TouchID指纹锁验证)

    // //  ViewController.m //  TouchID指纹验证 // //  Created by apple on 16/9/18. //  Copyright © 2016年 ap ...

  9. iOS 指纹认证登陆开发(TouchID)

    设计思路 TouchID 关联账号 用户登陆成功 -> 开启TouchID登陆 -> TouchID验证 -> 记录用户信息(验证通过) -> 关联完成 TouchID 登陆 ...

随机推荐

  1. C# Common Code

    DatePicker 控件日期格式化,可以在App.xaml.cs中添加下面代码 方法一 不推荐: Thread.CurrentThread.CurrentCulture = (CultureInfo ...

  2. tensorflow源码阅读(c++)(一)

    root/tensorflow/core |--common_runtime # 公共运行库 |--distributed_runtime # 分布式执行模块,含有grpc session, grpc ...

  3. mysql7.5.x删除重新安装

    删除: cmd管理员运行,进入D:\devs\MySQL\mysql-5.7.25-winx64\bin目录下: 输入命令:sc delete mysql 删除data目录下的所有文件 安装: 创建m ...

  4. JMeter 通过JSON Extractor 插件来提取响应结果

    接口响应结果,通常为HTML.JSON格式的数据,对于HTML的响应结果的提取,可以通过正则表达式,也可以通过XPath 来提取. 对于JSON格式的数据,可以通过正则表达式.JSON Extract ...

  5. 《笨方法学Python》加分题29

    加分练习猜一猜 “if 语句” 是什么,他有什么作用.在做下一道题之前,试着用自己的话回答下面的问题: 你认为 if 对他下一行代码做了什么?为什么 if 语句的下一行需要 4 个空格缩进?如果不缩进 ...

  6. EasyPR源码剖析(9):字符识别

    在上一篇文章的介绍中,我们已经通过相应的字符分割方法,将车牌区域进行分割,得到7个分割字符图块,接下来要做的就是将字符图块放入训练好的神经网络模型,通过模型来预测每个图块所表示的具体字符.神经网络的介 ...

  7. python基础之Day22

    1.组合 什么是? 一个类的对象具备某一个属性,该属性值属于另一个类的对象,这样就可以引用 为何用: 解决类与类之间代码冗余问题 如何用? 2.菱形继承 单继承:一个个往父类上查找 菱形:一个子类继承 ...

  8. linux学习第十五天 (Linux就该这么学) 找到一本不错的Linux电子书,附《Linux就该这么学》章节目录

    今天收尾DNS内容复习了,还有分享解析配置,都没有记,主要访问同一个域名,就近访问,

  9. vue与js混用

    Vue 的官方是不建议直接操作 DOM 的,Vue 的用途在于视图和数据的绑定.如果通过JQuery 直接操作 DOM 的话,势必会造成视图数据和模型数据的不匹配,这样 Vue 就失去它存在的意义了. ...

  10. day31并发

    以后你为之奋斗的两点: 提高cpu的利用率 提高用户的体验  1.纯概念/纯方法 操作系统的发展历程 #主要的人机矛盾是什么:CPU的使用率 #输入\输出数据和CPU计算没有关系 #操作系统是怎么进化 ...