热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ios指纹TouchID

最近在做一套登录系统,包括指纹登录、手势登录以及账号密码登录,在此简单记录一下指纹的处理逻辑。指纹处理:1、处理iOS9.0之后ÿ

  

  最近在做一套登录系统,包括指纹登录、手势登录以及账号密码登录,在此简单记录一下指纹的处理逻辑。

  


 

 

指纹处理:
1、处理iOS 9.0之后,指纹被锁不会自动弹出密码解锁的情况;
2、处理iOS 10.*系统不区分未录入指纹和未设置密码的情况;
流程图:此处有图,周末再画
周末补上
代码如下:
.h:

// Created by ever on 17/3/7.
// Copyright © 2017年 ever. All rights reserved.
//
#import
typedef NS_ENUM(NSInteger, TITouchIDVerificationError) {TITouchIDVerificationErrorLocalizedReason,TITouchIDVerificationErrorAuthFailMessage,TITouchIDVerificationErrorNotAvailableMessage,TITouchIDVerificationErrorNotEnrolledMessage,TITouchIDVerificationErrorLockOut,TITouchIDVerificationErrorPasscodeNotSetMessage,TITouchIDVerificationErrorUserCancel,TITouchIDVerificationErrorAppCancel,TITouchIDVerificationErrorUnknown
};typedef NS_ENUM(NSInteger, TIVerificationStatus) {TIVerificationStatusSuccess,TIVerificationStatusPasswordNotSet,TIVerificationStatusNotEncrolled,TIVerificationStatusFailed,TIVerificationStatusFallback,TIVerificationStatusLockOut,TIVerificationStatusCancel,TIVerificationStatusError,
};typedef
void(^VerificationCompletion)(TIVerificationStatus status, NSError *error);@interface LYYTouchID : NSObject
/**调用TouchID@param completion 验证完成,如果返回YES,验证成功;如果返回NO,验证失败(输入密码和指纹验证失败)*/
+ (void)touchVerificationWithFallbackTitle:(NSString*)fallbackTitle completion:(VerificationCompletion)completion;@end

 

.m:

// Created by ever on 17/3/7.
// Copyright © 2017年 ever. All rights reserved.#import "LYYTouchID.h"
#import
#import #define TI_IS_iOS_LATER(num) ([UIDevice currentDevice].systemVersion.floatValue >= (num))
#define TI_IS_iOS8_LATER TI_IS_iOS_LATER(8.0)
#define TI_IS_iOS9_LATER TI_IS_iOS_LATER(9.0)
#define TI_IS_iOS10_LATER TI_IS_iOS_LATER(10.0)
#define TI_IS_iOS11_LATER TI_IS_iOS_LATER(11.0)NSString * const TouchIDLocalizedReason = @"请您验证已有TouchID";
NSString
* const TouchIDNotAvailableMessage = @"您当前设备不支持TouchID";
NSString
* const TouchIDNotEnrolledMessage = @"您当前没有录入指纹信息";
NSString
* const TouchIDNotCorrectMessage = @"您的指纹信息不匹配";
NSString
* const TouchIDPasscodeNotSetMessage = @"您当前没有设置密码";
NSString
* const TouchIDCancelMessage = @"您已取消验证TouchID";
NSString
* const TouchIDUnknownErrorMessage = @"出现未知错误";
NSString
* const TouchIDLockOutMessage = @"TouchID 被锁定";static BOOL _isTouchIDSecondCheck;//用于存储第一遍canEvaluatePolicy检查到的指纹被锁的状态
static BOOL _touchIDSecondCheck;//用于存储canEvaluatePolicy是否是第二次查询@interface LYYTouchID ()
@end@implementation LYYTouchID#pragma mark - 验证
+ (void)touchVerificationWithFallbackTitle:(NSString*)fallbackTitle completion:(VerificationCompletion)completion{LAContext *context = [[LAContext alloc] init];context.localizedFallbackTitle = fallbackTitle?:@"";LAPolicy policy = [self setPolicy];NSError *notSupportError = nil;if ([context canEvaluatePolicy:policy error:&notSupportError]) {//处理10.*系统纯指纹策略不走passwordNotSet方法if (_touchIDSecondCheck&&TI_IS_iOS10_LATER&&!TI_IS_iOS11_LATER) {//第二次检测指纹是否可用(指纹+密码策略),且可以_touchIDSecondCheck = NO;completion(TIVerificationStatusNotEncrolled,[self returnErrorInfoWithErrorCode:LAErrorTouchIDNotEnrolled]);return;}//不是第二次检测指纹是否可用,直接进行验证[context evaluatePolicy:policy localizedReason:TouchIDLocalizedReason reply:^(BOOL success, NSError * _Nullable error) {dispatch_async(dispatch_get_main_queue(), ^{if (success) {if (TI_IS_iOS9_LATER&&_isTouchIDSecondCheck) {//TouchID 解锁成功时,更改为纯指纹策略,验证TouchID_isTouchIDSecondCheck = NO;[self touchVerificationWithFallbackTitle:fallbackTitle completion:completion];}else{//ios9.0之前版本不支持密码策略直接返回信息_isTouchIDSecondCheck = NO;completion(TIVerificationStatusSuccess,nil);}}else {int code = (int)error.code;////设置锁定状态为NO_isTouchIDSecondCheck = NO;[self dealErrorWithErrorCode:code fallbackTitle:fallbackTitle complection:completion];}});}];}else {[self dealErrorWithErrorCode:(int)notSupportError.code fallbackTitle:fallbackTitle complection:completion];}
}
#pragma mark - 设置指纹策略
+ (LAPolicy)setPolicy{LAPolicy policy;if (_touchIDSecondCheck&&TI_IS_iOS9_LATER){//已经查验过纯指纹策略,且纯指纹策略不支持,改变策略为指纹+密码进行二次验证policy = LAPolicyDeviceOwnerAuthentication;return policy;}if (_isTouchIDSecondCheck&&TI_IS_iOS9_LATER) {//指纹被锁定且系统大于9.0,使用“指纹+密码”策略policy = LAPolicyDeviceOwnerAuthentication;}else{//使用“指纹”策略(默认是指纹策略)policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;}return policy;
}
#pragma mark - 处理不同错误
+ (void)dealErrorWithErrorCode:(int)code fallbackTitle:(NSString*)fallbackTitle complection:(VerificationCompletion)completion{switch (code) {case LAErrorUserFallback:completion(TIVerificationStatusFallback,[self returnErrorInfoWithErrorCode:code]);break;case LAErrorAuthenticationFailed:completion(TIVerificationStatusFailed,[self returnErrorInfoWithErrorCode:code]);break;case LAErrorSystemCancel:{_isTouchIDSecondCheck = NO;_touchIDSecondCheck = NO;}break;case LAErrorPasscodeNotSet:_isTouchIDSecondCheck = NO;_touchIDSecondCheck = NO;completion(TIVerificationStatusPasswordNotSet,[self returnErrorInfoWithErrorCode:code]);break;case LAErrorTouchIDNotAvailable:break;case LAErrorAppCancel:{_isTouchIDSecondCheck = NO;_touchIDSecondCheck = NO;}break;case LAErrorUserCancel:_isTouchIDSecondCheck = NO;_touchIDSecondCheck = NO;completion(TIVerificationStatusCancel,[self returnErrorInfoWithErrorCode:code]);break;default: {if (TI_IS_iOS9_LATER) {if (code==LAErrorTouchIDLockout) {//ios9.0更改为密码策略,解锁TouchID_isTouchIDSecondCheck = YES;[self touchVerificationWithFallbackTitle:fallbackTitle completion:completion];break;}}if (TI_IS_iOS8_LATER&&!TI_IS_iOS11_LATER) {if (code==LAErrorTouchIDNotEnrolled) {//处理ios 10.*系统不走passwordNotSetif (TI_IS_iOS10_LATER&&!_touchIDSecondCheck) {//ios 9.0之后,第一次返回指纹不可用的结果(这时是纯指纹策略)_touchIDSecondCheck = YES;[self touchVerificationWithFallbackTitle:fallbackTitle completion:completion];}else{//ios 9.0 之后是第二次返回不可用结果,此时采用的是指纹+密码策略,此时指纹确实不可用//ios 9.0 之前,第一次返回指纹不可用的结果,此时直接返回指纹不可用的错误_touchIDSecondCheck = NO;completion(TIVerificationStatusNotEncrolled,[self returnErrorInfoWithErrorCode:code]);}break;}}if (@available(iOS 11.0, *)) {if (code==LAErrorBiometryNotEnrolled) {completion(TIVerificationStatusNotEncrolled,[self returnErrorInfoWithErrorCode:code]);break;}}completion(TIVerificationStatusError,[self returnErrorInfoWithErrorCode:code]);}break;}
}
#pragma mark - 生成error
+ (NSError *)returnErrorInfoWithErrorCode:(int)errorCode {if (TI_IS_iOS9_LATER) {if (errorCode == LAErrorAppCancel) {NSError *tempError = [NSError errorWithDomain:@"TouchIDVerfityDomain" code:TITouchIDVerificationErrorAppCancel userInfo:@{@"message":TouchIDCancelMessage}];return tempError;}}NSString *errorMessage = @"";NSUInteger errCode = 0;switch (errorCode) {case LAErrorTouchIDNotAvailable:errorMessage = TouchIDNotAvailableMessage;errCode = TITouchIDVerificationErrorNotAvailableMessage;break;case LAErrorAuthenticationFailed:errorMessage = TouchIDNotCorrectMessage;errCode = TITouchIDVerificationErrorAuthFailMessage;break;case LAErrorPasscodeNotSet:errorMessage = TouchIDPasscodeNotSetMessage;errCode = TITouchIDVerificationErrorPasscodeNotSetMessage;break;case LAErrorUserCancel:errorMessage = TouchIDCancelMessage;errCode = TITouchIDVerificationErrorUserCancel;break;default:if (TI_IS_iOS9_LATER) {if (errorCode==LAErrorTouchIDLockout) {errorMessage = TouchIDLockOutMessage;errCode = TITouchIDVerificationErrorLockOut;break;}}if (TI_IS_iOS8_LATER&&!TI_IS_iOS11_LATER) {if (errorCode==LAErrorTouchIDNotEnrolled) {errorMessage = TouchIDNotEnrolledMessage;errCode = TITouchIDVerificationErrorNotEnrolledMessage;break;}}if (@available(iOS 11.0, *)) {if (errorCode==LAErrorBiometryNotEnrolled) {errorMessage = TouchIDNotEnrolledMessage;errCode = TITouchIDVerificationErrorNotEnrolledMessage;break;}}errorMessage = TouchIDUnknownErrorMessage;errCode = TITouchIDVerificationErrorUnknown;break;}NSError *tempError = [NSError errorWithDomain:@"TouchIDVerfityDomain" code:errCode userInfo:@{@"message":errorMessage}];//
return tempError;
}
@end

 


转:https://www.cnblogs.com/sunjianfei/p/7885927.html



推荐阅读
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
author-avatar
mobiledu2502907423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有