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. About Feature Scaling and Normalization

    在进行数据处理之前,一定要想一想,你的算法是用来做什么,这样才能选择如何对数据进行预处理. 参考网站: http://sebastianraschka.com/Articles/2014_about_ ...

  2. 学习日记--用Vector(向量)实现动态数组

    Vector的使用方法: 能在添加元素时增加长度的数组称为动态数组或可变长数组.相对地,必须事先指定长度,只能容纳一定数量元素的数组称为静态数组.下面分享一下如何借助STL(标准模板库)中的Vecto ...

  3. Spring+Quartz集群环境下定时调度的解决方案

    集群环境可能出现的问题 在上一篇博客我们介绍了如何在自己的项目中从无到有的添加了Quartz定时调度引擎,其实就是一个Quartz 和Spring的整合过程,很容易实现,但是我们现在企业中项目通常都是 ...

  4. IIS发布MVC ASP.NET网站

    发布网站后,发现无法访问,最后在配置文件上添加一段: <system.codedom> <compilers> <compiler language="c#;c ...

  5. SummerNote 富文本编辑器 - Rails 集成

    使用官方提供的CDN服务 将下面一段加入layout文件中 <link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/css ...

  6. Visual Studio Installer 使用案例

    1.创建自定义操作 一步:新建“安装程序类”文件 2.重写函数: public override void Install(IDictionary stateSaver) { base.Install ...

  7. database锁实现

    单独创建一张表存放获取锁所需的key和value,key值保持唯一,value从0开始按1递增,在代码中用私有成员变量ConcurrentHashMap存储每个key value值,初始化时每个线程的 ...

  8. 通过PHP调用微信JSSDK实例

    JSSDK使用步骤: 1. 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 2. 采用http GET方式请求获得access_token(有效期7200秒). 3. ...

  9. strcat的用法

    原型: char *strcat(char *str1,char *str2); strcat的实现: char* MyStrcat(char *dst, const char*src) { if ( ...

  10. 原来这就是 UI 设计师的门槛

    本文主要分享 UI 设计师入行的一些个人经验指南,希望可以带给新入行业的设计师一点帮助! 写在前面 随着互联网的不断发展,特别是移动互联网的不断成熟,视觉设计师也进行了迭代与细分.衍生出的 UI 设计 ...