iOS_使用LAContext实现TouchID(指纹识别)的使用
2017-08-01 14:36
597 查看
在iPhone5s问世后,苹果的后续移动设备相继添加了指纹功能,从实际使用中还是相当方便的,比如快捷支付、快捷登录等应用场景,系统也提供给了我们相关的操作框架:LocalAuthentication,使用LAContext对象即可完成指纹识别,由于指纹识别时遇到的情况也比较多,所以我做了相应的封装,代码具体如下:
LM_TouchID.h 内容:
// // LM_TouchID.h // TouchID // // Created by CoderDoctorLee on 16/6/16. // Copyright © 2016年 CoderDoctorLee. All rights reserved. // #import <UIKit/UIKit.h> #import <LocalAuthentication/LocalAuthentication.h> @protocol LM_TouchID_Delegate <NSObject> //必须实现的两个代理方法: @required /** * @author CoderDoctorLee, 16-06-16 22:06:06 * * 验证成功 */ - (void)LM_TouchID_AuthorizeSuccess; /** * @author CoderDoctorLee, 16-06-16 22:06:41 * * 验证失败 */ - (void)LM_TouchID_AuthorizeFailure; //选择实现的代理方法: @optional /** * @author CoderDoctorLee, 16-06-16 22:06:12 * * 取消了验证(点击了取消) */ - (void)LM_TouchID_AuthorizeUserCancel; /** * @author CoderDoctorLee, 16-06-16 22:06:58 * * 在TouchID对话框点击输入密码按钮 */ - (void)LM_TouchID_AuthorizeUserFallBack; /** * @author CoderDoctorLee, 16-06-16 22:06:58 * * 在验证的TouchID的过程中被系统取消 例如突然来电话、按了Home键、锁屏... */ - (void)LM_TouchID_AuthorizeSystemCancel; /** * @author CoderDoctorLee, 16-06-16 22:06:18 * * 无法使用TouchID,设备没有设置密码 */ - (void)LM_TouchID_AuthorizePasswordNotSet; /** * @author CoderDoctorLee, 16-06-16 22:06:15 * * 没有录入TouchID,无法使用 */ - (void)LM_TouchID_AuthorizeTouchIDNotSet; /** * @author CoderDoctorLee, 16-06-16 22:06:19 * * 该设备的TouchID无效 */ - (void)LM_TouchID_AuthorizeTouchIDNotAvailable; /** * @author CoderDoctorLee, 16-06-16 22:06:17 * * 多次连续使用Touch ID失败,Touch ID被锁,需要用户输入密码解锁 */ - (void)LM_TouchID_AuthorizeTouchIDNotLockOut; /** * @author CoderDoctorLee, 16-06-16 22:06:47 * * 当前软件被挂起取消了授权(如突然来了电话,应用进入前台) */ - (void)LM_TouchID_AuthorizeTouchIDAppCancel; /** * @author CoderDoctorLee, 16-06-16 22:06:45 * * 当前软件被挂起取消了授权 (授权过程中,LAContext对象被释) */ - (void)LM_TouchID_AuthorizeTouchIDInvalidContext; /** * @author CoderDoctorLee, 16-06-16 22:06:29 * * 当前设备不支持指纹识别 */ - (void)LM_TouchID_AuthorizeNotSupport; @end @interface LM_TouchID : LAContext @property (nonatomic, assign) id<LM_TouchID_Delegate> delegate; /** * @author CoderDoctorLee, 16-06-16 22:06:51 * * 发起指纹验证: */ - (void)startLM_TouchID_WithMessage:(NSString *)message FallBackTitle:(NSString *)fallBackTitle Delegate:(id<LM_TouchID_Delegate>)delegate; @end
LM_TouchID.m 内容:
// // LM_TouchID.m // TouchID // // Created by CoderDoctorLee on 16/6/16. // Copyright © 2016年 CoderDoctorLee. All rights reserved. // #import "LM_TouchID.h" @implementation LM_TouchID - (void)startLM_TouchID_WithMessage:(NSString *)message FallBackTitle:(NSString *)fallBackTitle Delegate:(id<LM_TouchID_Delegate>)delegate { LAContext *context = [[LAContext alloc] init]; context.localizedFallbackTitle = fallBackTitle; NSError *error = nil; self.delegate = delegate; //判断代理人是否为空 if (self.delegate != nil) { if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { //使用context对象对识别的情况进行评估 [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:message reply:^(BOOL success, NSError * _Nullable error) { //识别成功: if (success) { if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeSuccess)]) { //必须回到主线程执行,否则在更新UI时会出错!以下相同 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeSuccess]; }]; } } //识别失败(对应代理方法的每种情况,不实现对应方法就没有反应) else if (error) { switch (error.code) { case LAErrorAuthenticationFailed:{ if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeFailure)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeFailure]; }]; } break; } case LAErrorUserCancel:{ if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeUserCancel)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeUserCancel]; }]; } break; } case LAErrorUserFallback:{ if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeUserFallBack)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeUserFallBack]; }]; } break; } case LAErrorSystemCancel:{ if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeSystemCancel)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeSystemCancel]; }]; } break; } case LAErrorTouchIDNotEnrolled: { if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDNotSet)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeTouchIDNotSet]; }]; } break; } case LAErrorPasscodeNotSet:{ if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizePasswordNotSet)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizePasswordNotSet]; }]; } break; } case LAErrorTouchIDNotAvailable:{ if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDNotAvailable)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeTouchIDNotAvailable]; }]; } break; } case LAErrorTouchIDLockout:{ if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDNotLockOut)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeTouchIDNotLockOut]; }]; } break; } case LAErrorAppCancel:{ if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDAppCancel)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeTouchIDAppCancel]; }]; } break; } case LAErrorInvalidContext:{ if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDInvalidContext)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeTouchIDInvalidContext]; }]; } break; } default: break; } } }]; } } //设备不支持指纹识别 else { if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeNotSupport)]) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.delegate LM_TouchID_AuthorizeNotSupport]; }]; } } } @end
在ViewController里使用示例:
// // ViewController.m // TouchID // // Created by CoderDoctorLee on 16/6/17. // Copyright © 2016年 CoderDoctorLee. All rights reserved. // #import "ViewController.h" #import "LM_TouchID.h" @interface ViewController ()<LM_TouchID_Delegate> @property(nonatomic, strong)UILabel *label; @property(nonatomic, strong)LM_TouchID *touchID; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //用来显示验证信息 self.label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 175, 50)]; _label.backgroundColor = [UIColor blueColor]; _label.textColor = [UIColor whiteColor]; [self.view addSubview:_label]; self.touchID = [[LM_TouchID alloc] init]; //开始验证: [_touchID startLM_TouchID_WithMessage:@"请验证指纹转账100万" FallBackTitle:@"输入密码" Delegate:self]; } - (void)LM_TouchID_AuthorizeSuccess { _label.text = @"验证成功"; } - (void)LM_TouchID_AuthorizeFailure { _label.text = @"验证失败"; } - (void)LM_TouchID_AuthorizeNotSupport { _label.text = @"设备不支持"; } - (void)LM_TouchID_AuthorizeUserCancel { _label.text = @"用户取消了验证"; } //其他代理方法就不一一实现了,大家可以自行测验 - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
相关文章推荐
- iOS TouchID 指纹识别
- iOS实现指纹识别
- 使用iOS 8 SDK添加Touch ID指纹识别功能
- 简单实现iOS指纹解锁(TouchID)
- iOS 中Touch ID(指纹识别技术) 的使用
- iOS开发 实现指纹识别及验证
- 使用Swift代码实现iOS手势解锁、指纹解锁实例详解
- 使用iOS 8 SDK添加Touch ID指纹识别功能
- iOS指纹识别登录流程及实现
- IOS_使用coreImage实现图片中的人脸识别
- 使用Opencv实现IOS平台下的人脸识别
- iOS使用ZBar实现二维码扫描以及实现识别相册中二维码图片功能
- iOS开发实现TouchID指纹解锁
- 使用iOS 8 SDK添加Touch ID指纹识别功能
- iOS开发实现TouchID指纹解锁
- iOS指纹识别登录流程及实现
- 使用Arduino开发板实现基于指纹识别的生物特征考勤系统
- 使用iOS 9 SDK添加Touch ID指纹识别功能
- iOS开发实现TouchID指纹解锁
- 使用iOS 8 SDK添加Touch ID指纹识别功能