iOS --- Touch ID指纹解锁
https://www.cnblogs.com/ljmaque/p/TouchID.html
最近在项目中刚好用到了TouchId指纹解锁功能,之前也没有接触过,立马百度看看究竟是要如何使用,发现其实也不是很复杂。
文章后面有封装的工具方法,可以直接copy使用。
下面开始跟大家分享一下:
一、使用要点:
(1)需要导入库 LocalAuthentication.framework
(2)引入头文件 #import <LocalAuthentication/LocalAuthentication.h>
(3)指纹解锁只支持iOS 8及以上的版本
(4)如果指纹验证多次错误会被锁定,只能通过输入手机密码来重新启用。iOS 9 提供了一个方法,可以直接调起密码输入界面。
(5)所有操作必须要回到主线程,因为系统的验证是在子线程。
(6)所有的错误处理是通过一个枚举来判断处理的,具体作用看注释
二、代码要点
(1)这是判断系统版本是否大于iOS 8
if (!(MQ_CURRENT_DEVICE_SYSTEM_VERSION >= 8.0)) {
result(NO, MQ_TOUCHID_ERROR_SYSTEM_NOT_SUPPORT);
return;
}
(2)判断是否可用
// 返回bool值
[authenContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]
3)下面的就是重要的点 :
指纹解锁多次失败以后,系统会锁定TouchID硬件必须通过输入手机密码来解锁,如果系统是iOS8的话,TouchID被锁定以后只能通过重启手机来重新开启。
//系统提供的两个验证的枚举
typedef NS_ENUM(NSInteger, LAPolicy)
{
LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics, LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_0) = kLAPolicyDeviceOwnerAuthentication } NS_ENUM_AVAILABLE(10_10, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0); kLAPolicyDeviceOwnerAuthentication 这个值只有在iOS9.0及以后才可以使用,利用这个值可以调出输入密码来解锁TouchID的界面。
[authenContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:TOUCHID_NOTICE_MESSAGE
reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
//已经重新解锁Touchid
}
}];
开始指纹解锁代码
[authenContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:TOUCHID_NOTICE_MESSAGE
reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
// 解锁成功
}
}];
(4)看看系统的错误枚举
typedef NS_ENUM(NSInteger, LAError)
{
/// Authentication was not successful, because user failed to provide valid credentials.
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed, /// Authentication was canceled by user (e.g. tapped Cancel button).
LAErrorUserCancel = kLAErrorUserCancel, /// Authentication was canceled, because the user tapped the fallback button (Enter Password).
LAErrorUserFallback = kLAErrorUserFallback, /// Authentication was canceled by system (e.g. another application went to foreground).
LAErrorSystemCancel = kLAErrorSystemCancel, /// Authentication could not start, because passcode is not set on the device.
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet, /// Authentication could not start, because Touch ID is not available on the device.
LAErrorTouchIDNotAvailable NS_ENUM_DEPRECATED(10_10, 10_13, 8_0, 11_0, "use LAErrorBiometryNotAvailable") = kLAErrorTouchIDNotAvailable, /// Authentication could not start, because Touch ID has no enrolled fingers.
LAErrorTouchIDNotEnrolled NS_ENUM_DEPRECATED(10_10, 10_13, 8_0, 11_0, "use LAErrorBiometryNotEnrolled") = kLAErrorTouchIDNotEnrolled, /// Authentication was not successful, because there were too many failed Touch ID attempts and
/// Touch ID is now locked. Passcode is required to unlock Touch ID, e.g. evaluating
/// LAPolicyDeviceOwnerAuthenticationWithBiometrics will ask for passcode as a prerequisite.
LAErrorTouchIDLockout NS_ENUM_DEPRECATED(10_11, 10_13, 9_0, 11_0, "use LAErrorBiometryLockout")
__WATCHOS_DEPRECATED(3.0, 4.0, "use LAErrorBiometryLockout") __TVOS_DEPRECATED(10.0, 11.0, "use LAErrorBiometryLockout") = kLAErrorTouchIDLockout, /// Authentication was canceled by application (e.g. invalidate was called while
/// authentication was in progress).
LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel, /// LAContext passed to this call has been previously invalidated.
LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext, /// Authentication could not start, because biometry is not available on the device.
LAErrorBiometryNotAvailable NS_ENUM_AVAILABLE(10_13, 11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0) = kLAErrorBiometryNotAvailable, /// Authentication could not start, because biometry has no enrolled identities.
LAErrorBiometryNotEnrolled NS_ENUM_AVAILABLE(10_13, 11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0) = kLAErrorBiometryNotEnrolled, /// Authentication was not successful, because there were too many failed biometry attempts and
/// biometry is now locked. Passcode is required to unlock biometry, e.g. evaluating
/// LAPolicyDeviceOwnerAuthenticationWithBiometrics will ask for passcode as a prerequisite.
LAErrorBiometryLockout NS_ENUM_AVAILABLE(10_13, 11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0) = kLAErrorBiometryLockout, /// Authentication failed, because it would require showing UI which has been forbidden
/// by using interactionNotAllowed property.
LAErrorNotInteractive API_AVAILABLE(macos(10.10), ios(8.0), watchos(3.0), tvos(10.0)) = kLAErrorNotInteractive,
} NS_ENUM_AVAILABLE(10_10, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0);
三、这是我封装的工具类
(1)MQTouchID.h文件
//
// MQTouchID.h
// Test
//
// Created by PasserMontanus on 2018/3/21.
// Copyright © 2018年 lgl. All rights reserved.
//
#import <Foundation/Foundation.h> typedef NS_ENUM(NSInteger, MQ_TOUCHID_ERROR) {
// 系统不支持 要大于 8.0
MQ_TOUCHID_ERROR_SYSTEM_NOT_SUPPORT = 0,
// 验证成功
MQ_TOUCHID_ERROR_SUCCESS = 1,
// 系统取消授权,如其他APP切入
MQ_TOUCHID_ERROR_SYSTEM_CANCEL = -4,
// 用户取消验证Touch ID
MQ_TOUCHID_ERROR_USER_CANCEL = -2,
// 用户选择输入密码
MQ_TOUCHID_ERROR_USER_FALLBACK = -3,
//授权失败
MQ_TOUCHID_ERROR_FAILED = -1,
//系统未设置密码 这个密码在用户指纹多次验证失败的时候要用他来重新激活
MQ_TOUCHID_ERROR_PASSCODE_NOT_SET = -5,
//设备Touch ID不可用,例如未打开
MQ_TOUCHID_ERROR_NOT_AVAILABLE = -6,
//设备Touch ID不可用,用户没有录入指纹
MQ_TOUCHID_ERROR_NOT_ENROLLED = -7,
//身份验证失败,因为它需要显示已被禁止的UI
MQ_TOUCHID_ERROR_NOT_INTERACTIVE = -1004,
// 设备Touch ID被锁定,输入错误的次数过多 这个时候需要密码来重新激活
MQ_TOUCHID_ERROR_LOCKOUT = -8 ,
//应用程序已取消身份验证
MQ_TOUCHID_ERROR_APP_CANCEL = -9,
// 传递给此调用的LAContext先前已失效。
MQ_TOUCHID_ERROR_INVALID_CONTEXT = -10
}; typedef void(^MQTouchIDResult)(BOOL isSuccess, MQ_TOUCHID_ERROR error_code); @interface MQTouchID : NSObject /**
开始验证 TouchID 指纹解锁 (需要导入 LocalAuthentication.framework) 注意: 结果回调以后的操作都需要回到主线程 这个验证是在子线程里面执行的
*/
+ (void)validateTouchID:(MQTouchIDResult)result; @end
(2)MQTouchID.m文件
//
// MQTouchID.m
// Test
//
// Created by PasserMontanus on 2018/3/21.
// Copyright © 2018年 lgl. All rights reserved.
//
#import "MQTouchID.h"
#import <LocalAuthentication/LocalAuthentication.h> #define MQ_CURRENT_DEVICE_SYSTEM_VERSION ([[UIDevice currentDevice]systemVersion].doubleValue) static NSString * TOUCHID_NOTICE_MESSAGE = @"通过Home键验证已有的手机指纹";
static NSString * TOUCHID_NOTICE_RESTART_MESSAGE = @"重新开启TouchID功能"; @implementation MQTouchID + (void)validateTouchID:(MQTouchIDResult)result {
if (!(MQ_CURRENT_DEVICE_SYSTEM_VERSION >= 8.0)) {
result(NO, MQ_TOUCHID_ERROR_SYSTEM_NOT_SUPPORT);
return;
}
LAContext *authenContext = [[LAContext alloc]init];
NSError* error = nil;
if ([authenContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 可用
[self startValidateTouchID:authenContext result:result];
} else { // 不可用
MQ_TOUCHID_ERROR erroCode = [self errorCode:error.code];
[self processingTouchIdError:authenContext erroCode:erroCode result:result];
}
} + (void)startValidateTouchID:(LAContext *)authenContext result:(MQTouchIDResult)result {
[authenContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:TOUCHID_NOTICE_MESSAGE
reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
result(YES,MQ_TOUCHID_ERROR_SUCCESS);
} else {
MQ_TOUCHID_ERROR erroCode = [self errorCode:error.code];
[self processingTouchIdError:authenContext erroCode:erroCode result:result];
}
}];
} + (void)processingTouchIdError:(LAContext *)authenContext
erroCode:(MQ_TOUCHID_ERROR)erroCode
result:(MQTouchIDResult)result { if (@available(iOS 9.0, *)) {
if (erroCode == MQ_TOUCHID_ERROR_LOCKOUT) {
[authenContext evaluatePolicy:LAPolicyDeviceOwnerAuthentication
localizedReason:TOUCHID_NOTICE_RESTART_MESSAGE
reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
[self validateTouchID:result];
} else {
result(NO, MQ_TOUCHID_ERROR_USER_CANCEL);
}
}]; } else {
result(NO, erroCode);
}
} else {
result(NO, erroCode);
}
} + (MQ_TOUCHID_ERROR)errorCode:(NSInteger )errorCode {
switch (errorCode) {
case LAErrorSystemCancel:{ // 系统取消授权,如其他APP切入
return MQ_TOUCHID_ERROR_SYSTEM_CANCEL;
break;
}
case LAErrorUserCancel:{ // 用户取消验证Touch ID
return MQ_TOUCHID_ERROR_USER_CANCEL;
break;
}
case LAErrorUserFallback:{ // 用户选择输入密码
return MQ_TOUCHID_ERROR_USER_FALLBACK;
break;
}
case LAErrorAuthenticationFailed:{ // //授权失败
return MQ_TOUCHID_ERROR_FAILED;
break;
}
case LAErrorPasscodeNotSet: { //系统未设置密码 这个密码在用户指纹多次验证失败的时候要用他来重新激活
return MQ_TOUCHID_ERROR_PASSCODE_NOT_SET;
break;
}
case LAErrorTouchIDNotAvailable: { //设备Touch ID不可用,例如未打开
return MQ_TOUCHID_ERROR_NOT_AVAILABLE;
break;
}
case LAErrorTouchIDNotEnrolled: { //设备Touch ID不可用,用户没有录入指纹
return MQ_TOUCHID_ERROR_NOT_ENROLLED;
break;
}
case LAErrorNotInteractive: { // 身份验证失败,因为它需要显示已被禁止的UI
return MQ_TOUCHID_ERROR_NOT_INTERACTIVE;
break;
}
default:{
if (@available(iOS 9.0, *)) {
if (errorCode == LAErrorTouchIDLockout) { // 设备Touch ID被锁定,输入错误的次数过多 这个时候需要密码来重新激活
return MQ_TOUCHID_ERROR_LOCKOUT;
break;
} else {
if (errorCode == LAErrorInvalidContext) {
return MQ_TOUCHID_ERROR_INVALID_CONTEXT;
break;
} else if (errorCode == LAErrorAppCancel) {
return MQ_TOUCHID_ERROR_APP_CANCEL;
break;
} else {
return MQ_TOUCHID_ERROR_FAILED;
break;
}
}
} else {
return MQ_TOUCHID_ERROR_FAILED;
break;
}
}
}
} @end
四、最后结语
(1)最后的结果回调以后的操作一定要在主线程,系统验证在子线程进行
(2)以上就是我的一点小总结,欢迎大家指正。
iOS --- Touch ID指纹解锁的更多相关文章
- Touch ID指纹解锁使用
Touch ID是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心密码被别人看到,另 ...
- iOS Touch ID 身份认证
iOS Touch ID 身份认证 iOS 8 及以后录了指纹的设备可以使用 touch ID 进行身份认证,指纹符合录入的指纹才能认证成功. 步骤 导入 LocalAuthentication 框架 ...
- iOS- Swift:指触即开,如何集成Touch ID指纹识别功能
1.前言 随着移动支付时代的到来,Touch ID 指纹验证迅速被支付宝,微信钱包普及,相信各位朋友使用后也大呼方便.之前写了篇关于iOS9的3D Touch的集成使用,有朋友在我博客下提到,让我写一 ...
- iOS Touch Id 开发
Touch Id Touch Id是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心 ...
- iOS开发——Touch ID 指纹识别
项目中为了安全性,一般使用密码或iPhone手机的指纹识别Touch ID. 第一步,判断系统是否支持,iOS8.0及以上才支持. 第二步,判断手机是否支持,带Touch ID的手机iPhone5s及 ...
- iOS Touch ID 简易开发教程
转自:NsstringFromName 支持系统和机型 iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁 ...
- iOS开发之指纹解锁
http://blog.csdn.net/hongfengkt/article/details/49868073 前一阵子一直在赶项目进度,没有太多时间写博客,现在终于空闲了,将以前欠下的博客补上来. ...
- iOS Touch ID使用
1.首先导入头文件 #import <LocalAuthentication/LocalAuthentication.h> 2.关键代码 - (void)validateTouchID { ...
- iOS指纹识别Touch ID的安全性探讨
苹果公司在 iPhone 5s 的发布会上公布了全新的指纹识别安全技术,也就是 Touch ID,开创了生物安全识别技术在便携设备上使用的新篇章.此后,苹果还将此技术带到了 iPad 上.此前没有任何 ...
随机推荐
- spyder 快捷键
本文主要介绍了spyder的快捷键. 常用快捷键 快捷键 中文名称 Ctrl+R 替换文本 Ctrl+1 单行注释,单次注释,双次取消注释 Ctrl+4 块注释,单次注释,双次取消注释 F5 运行 ...
- miui10 傻瓜式安装google框架方法
miui10,打开自带的小米应用商店,搜索youtube,然后往下看选择百度的搜索源,点进去选择第一个下载就可以了. 下载完成之后会就提醒你安装google框架了, 点确定后自动就装好了,就是这么简单 ...
- 远程桌面连接一台关联无线的电脑(A)时,A电脑无线总是断开导致远程桌面连接失败
1. 我的环境: 两台电脑,分别记为PC1和PC2,PC1有线或者无线连在路由器上,PC2无线连在同一个路由器上.(当然,我的PC1是win10系统,PC2是win7系统) 2. PC1只要一远程连 ...
- Dos环境变量修改
批处理修改环境变量,修改用户变量.系统变量(全局变量),永久/临时设置环境变量.设置Java环境变量 临时环境变量 修改变量: set PATH=%Path%;%JAVA_HOME%\bin 含义:表 ...
- 【shell脚本】shell脚本实现的 函数差集查找
文本地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. 问题背景 2. 代码实现 1.问题背景 在做公司的测试的自动化测试时,覆盖了一些开发代码的函数,但是那些还没有做,使用一个函 ...
- 使用selenium时,使用从系统启动浏览器与通过自动化驱动方式启动浏览器控件ID不一样解决方法
最近遇到一个怪事,通过正常打开浏览器,按照正常的web登录然后点击进入系统流程,将各控件的ID识别成功,然后使用 python3+selenium写好脚本,高高兴兴的用脚本跑时老是提示找不到控件,然后 ...
- 【Teradata】并行操作工具
1.psh并行shell //单机模式 psh date psh pdestate -a psh verify_pdisks //交互模式 psh psh.>help psh.>selec ...
- 【Linux基础】VM使用
VM三种联网方法和原理 (1)Bridged桥接 使用VMnet0虚拟交换机,此时虚拟机相当与网络上的一台独立计算机与主机一样,拥有一个独立的IP地址,所有机器均可互访,可以联网.使用桥接方式,A,A ...
- jq stop()和:is(":animated")用法区别
stop(true,true): 表示停止匹配元素正在进行的动画并跳转到末状态,清空未执行完的动画队列.常用于”解决光标移入移出得过快导致的动画效果与光标动作不一致“问题! jQuery stop() ...
- centos7下安装docker(19容器架构)
What,Why,How What:什么是容器? 说起容器大家想到的是什么? 集装箱(container),虚拟机,docker,k8s 1. 没毛病,因为容器与集装箱的英文都可以翻译成co ...