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 上.此前没有任何 ...
随机推荐
- Windows Server 2016-域站点链接及复制时间调整
本章简单为大家介绍如何新建域链接并调整复制计划.生产环境中很多情况下需要我们手工去创建站点复制链接,并根据实际带宽情况调整复制计划以减轻网络压力等.站点内部署多台域控制器,域控制器间的 复制链接建议通 ...
- IPerf——网络测试工具介绍与源码解析(2)
对于IPerf源码解析,我是基于2.0.5版本在Windows下执行的情况进行分析的,提倡开始先通过对源码的简单修改使其能够在本地编译器运行起来,这样可以打印输出一些中间信息,对于理解源码的逻辑,程序 ...
- HOW TO ANSWER: Tell Me About Yourself
https://biginterview.com/blog/2011/09/tell-me-about-yourself.html There are some job interview quest ...
- C语言 矩阵的转置及矩阵的乘法
C语言 矩阵的转置及矩阵的乘法 //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.矩阵的转置 #include<stdio.h> #defi ...
- ab和jmeter进行GET/POST压力测试的使用心得和比较
引言: 互联网服务压测是非常重要的评价方法,ab,webbench,jmeter等都是业界流行的测试工具,ab和webbench作为shell模式下轻量级的测试工具,jmeter则作为有GUI界面的更 ...
- 关于陌生的依赖模块,如withStyles、react-apollo等
有自己不认识的依赖,可参考的学习方式: 1.各大技术分享网站的文章(最快) 2.npm官网下的文档(最全)
- 面试----你可以手写一个promise吗
参考:https://www.jianshu.com/p/473cd754311f <!DOCTYPE html> <html> <head> <meta c ...
- C#反射の反射泛型
C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转) 接上篇. 自定义一个泛型类(继承于接口) public ...
- Deep Knowledge Tracing (深度知识追踪)
论文:Deep Knowledge Tracing Addressing Two Problems in Deep Knowledge Tracing via Prediction-Consis ...
- masm的调试命令(debug)
-u命令:查看汇编代码: -t命令:执行下一条语句 -g + 的内存:跳转到该内存所对应的语句(再用t命令执行该条命令) -r命令:查看寄存器的内容(后可直接接寄存器的名称,就只查看该寄存器的内容) ...