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指纹解锁的更多相关文章

  1. Touch ID指纹解锁使用

    Touch ID是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心密码被别人看到,另 ...

  2. iOS Touch ID 身份认证

    iOS Touch ID 身份认证 iOS 8 及以后录了指纹的设备可以使用 touch ID 进行身份认证,指纹符合录入的指纹才能认证成功. 步骤 导入 LocalAuthentication 框架 ...

  3. iOS- Swift:指触即开,如何集成Touch ID指纹识别功能

    1.前言 随着移动支付时代的到来,Touch ID 指纹验证迅速被支付宝,微信钱包普及,相信各位朋友使用后也大呼方便.之前写了篇关于iOS9的3D Touch的集成使用,有朋友在我博客下提到,让我写一 ...

  4. iOS Touch Id 开发

    Touch Id Touch Id是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心 ...

  5. iOS开发——Touch ID 指纹识别

    项目中为了安全性,一般使用密码或iPhone手机的指纹识别Touch ID. 第一步,判断系统是否支持,iOS8.0及以上才支持. 第二步,判断手机是否支持,带Touch ID的手机iPhone5s及 ...

  6. iOS Touch ID 简易开发教程

    转自:NsstringFromName 支持系统和机型 iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁 ...

  7. iOS开发之指纹解锁

    http://blog.csdn.net/hongfengkt/article/details/49868073 前一阵子一直在赶项目进度,没有太多时间写博客,现在终于空闲了,将以前欠下的博客补上来. ...

  8. iOS Touch ID使用

    1.首先导入头文件 #import <LocalAuthentication/LocalAuthentication.h> 2.关键代码 - (void)validateTouchID { ...

  9. iOS指纹识别Touch ID的安全性探讨

    苹果公司在 iPhone 5s 的发布会上公布了全新的指纹识别安全技术,也就是 Touch ID,开创了生物安全识别技术在便携设备上使用的新篇章.此后,苹果还将此技术带到了 iPad 上.此前没有任何 ...

随机推荐

  1. 思科4506E做ehterchannel故障排查

    思科4506E做ehterchannel故障排查 转载于:https://blog.51cto.com/eric1026/1910912 一.故障描述 某客户有两台4506E汇聚交换机,需要做ethe ...

  2. ELK-logstash-6.3.2-常用配置

    1. input-file收集日志信息 [yun@mini04 config]$ pwd /app/logstash/config [yun@mini04 config]$ cat file.conf ...

  3. 028实现strStr()

    #pragma once #include "000库函数.h" /*********************自解**************/ //使用算法中的find 12ms ...

  4. M码小黄衫买家秀=w=

    M码小黄衫买家秀=w= 17°的天气穿不了短袖polo..就只能这样强行上图啦~ 因为我一直耿耿于大一面向对象课上拿到的那件XL码小黄衫,长到能穿到膝盖,拍小黄衫全家福时候只能很凄凉的借了件小号的穿, ...

  5. Java 过一下基础

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  6. MySQL高级知识(十二)——全局查询日志

    前言:全局查询日志用于保存所有的sql执行记录,该功能主要用于测试环境,在生产环境中永远不要开启该功能. 1.如何开启 #1.通过my.cnf配置开启该功能. 注:对my.cnf文件配置后,需重启my ...

  7. SpringBoot系列 - 集成JWT实现接口权限认证

    会飞的污熊 2018-01-22 16173 阅读 spring jwt springboot RESTful API认证方式 一般来讲,对于RESTful API都会有认证(Authenticati ...

  8. [HEOI2016/TJOI2016]字符串

    嘟嘟嘟 今天复习一下SAM. lcp固然不好做,干脆直接翻过来变成后缀.首先答案一定满足单调性,所以我们二分lcp的长度\(mid\),然后判断\(s[d \ldots d + mid - 1]\)是 ...

  9. javascript中数组化的一般见解

    javascript中数组化的一般见解,数组化浏览器中存在许多类数组对象,往往对类数组操作比较麻烦,没有数组那些非常方便的方法,在这种情况下,就有了数组化方法. 数组化的一般方法 1.第一种也是我们最 ...

  10. ESP8266 HTTP 项目(2)HTTP网页修改WIFI连接,上电自动连接上次的WIFI。

    网页 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf ...