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. Leetcode1000 合并石头的最低成本 区间DP

    有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数. 找出把所有石头合并成一堆的最低成 ...

  2. pom.xml文件释义

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. ListBox设置背景色无效的问题。 listview类似

    <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Template"&g ...

  4. xmlhttp js 请求

    <html> <script> var xhr = new XMLHttpRequest(); xhr.open('GET', "http://ipinfo.io/j ...

  5. ASP.NET Core下发布网站图解

    与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel ...

  6. vuex状态管理

    msvue组件间通信时,若需要改变多组件间共用状态的值.通过简单的组件间传值就会遇到问题.如:子组件只能接收但改变不了父组件的值.由此,vuex的出现就是用作各组件间的状态管理. 简单实例:vuex的 ...

  7. spark2.0源码学习

    [Spark2.0源码学习]-1.概述 [Spark2.0源码学习]-2.一切从脚本说起 [Spark2.0源码学习]-3.Endpoint模型介绍 [Spark2.0源码学习]-4.Master启动 ...

  8. 处理 NCBI taxonomy tree

    1. etetoolkit : github 官网:https://github.com/etetoolkit/ete 官网:http://etetoolkit.org/ 2. taxonkit gi ...

  9. buffer IO和direct IO

    最近在看很多框架,redis,kafka等底层都涉及到文件IO操作的效率问题,所以查了些资料,看到这篇文章讲的比较明白些,贴出来留存. 链接地址: https://www.ibm.com/develo ...

  10. 较大的互联网公司对Java的要求(转)

    现在各大互联网公司,对Java类的校招要求越来越高,导致很多小伙伴都很迷茫,今天分享一篇谢照东关于Java学习进阶之路,希望能帮助到一些人 佛说五蕴六毒是妄,将因果都念作业障 把看过的书罗列一下 &l ...