iOS TouchID & FaceID
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的更多相关文章
- iOS - TouchID 指纹识别
前言 NS_CLASS_AVAILABLE(10_10, 8_0) @interface LAContext : NSObject 指纹识别功能是 iPhone 5s 推出的,SDK 是 iOS 8. ...
- [译] iOS 11.4.1 Beta:全新的USB限制模式
(Source/原文链接 https://blog.elcomsoft.com/2018/06/ios-11-4-1-beta-usb-restricted-mode-has-arrived/) 作者 ...
- 170多个Ionic Framework学习资源(转载)
在Ionic官网找到的学习资源:http://blog.ionic.io/learning-ionic-in-your-living-room/ 网上的文章比较多,但是很多时候我们很难找到自己需要的. ...
- iOS12、iOS11、iOS10、iOS9常见适配
作者:花丶满楼 链接:https://juejin.im/post/5c49a7d0518825254e4d46fc 一.iOS12(Xcode10) 1.1.升级Xcode10后项目报错 不允许多个 ...
- iOS 指纹解锁 验证TouchID
iOS指纹解锁 1.首先,引入依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthenticatio ...
- ios --指纹TouchID
最近在做一套登录系统,包括指纹登录.手势登录以及账号密码登录,在此简单记录一下指纹的处理逻辑. 指纹处理: 1.处理iOS 9.0之后,指纹被锁不会自动弹出密码解锁的情况: 2.处理iOS 10.*系 ...
- swift 实现iOS手势密码、指纹密码、faceID
本博客包含了如何实现iOS手势密码.指纹密码.faceID全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBTouchID,支持swift3. ...
- iOS - (个人隐私钱包调用系统本机TouchID指纹锁验证)
// // ViewController.m // TouchID指纹验证 // // Created by apple on 16/9/18. // Copyright © 2016年 ap ...
- iOS 指纹认证登陆开发(TouchID)
设计思路 TouchID 关联账号 用户登陆成功 -> 开启TouchID登陆 -> TouchID验证 -> 记录用户信息(验证通过) -> 关联完成 TouchID 登陆 ...
随机推荐
- Appium+python自动化获取toast消息的方法
转载地址:https://www.cnblogs.com/shangren/p/8191879.html 1. 首先执行这个命令:npm install -g cnpm --registry=http ...
- Hillstone设备管理-恢复出厂设置
1.CLI命令行操作 unset all: 根据提示选择是否保存当前配置y/n: 选择是否重启y/n: 系统重启后即恢复到出厂设置. 2.webUI操作 “系统”—“配置”,点击“清除”按钮,系统会提 ...
- 使用SQL语句查询表及表字段类型说明
今天突然遇到有人要数据库表及表字段说明,数据库表太多又不能一个个表去找,就想想SQL是否能直接查询出来. 经过查询资料,加上一些自己的一些调整写了一个sql语句,在此记录一下,以方便日后查找使用. S ...
- Checked Uncheckd异常
Checked : 你可以在写代码的时候就throw 或者try catch 的 Unchecked : Error + RuntimeException .提前无法预测的 http://www ...
- Falsk SqlAlchemy
pip install mysql-connector from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Fl ...
- Callable Future接口的设计原理
我们都知道Callable接口作为任务给线程池来执行,可以通过Future对象来获取返回值,他们背后的实现原理是什么?通过总结背后的实现原理有助于我们深入的理解相关技术,做到触类旁通和举一反三. 文章 ...
- django添加控件
function bindRemoveCls() { $('#removeCls').click(function () { var options = $('#sel')[0].selectedOp ...
- HTTP之响应消息Response
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息. HTTP响应也由四个部分组成,分别是:状态行.消息报头.空行和响应正文. 例子 HTTP/1.1 200 OK Date ...
- 实现一个简易版RPC
上篇博客主要介绍了dubbo的使用,这篇文章主要深入rpc的核心原理 准备知识: 1 java 网络编程(这里使用的bio) 2 java动态代理 3 反射 ===================== ...
- 【ElasticSearch】 elasticsearch-head插件安装
本章介绍elasticsearch-head插件安装,elasticsearch安装参考:[ElasticSearch] 安装 elasticsearch-head安装和学习可参照官方文档: http ...