从iPhone 5s、iOS7开始,就有指纹识别了,不过指纹识别的API好像是iOS8出来之后才开放的,具体记得不是很清楚了。
最近没事研究了一下指纹识别,不过我看到网上关于这方面的资料都不是很全,所以我就来写一下,对我也可以强化一下记忆,让大家也可以参考参考。
其实这个东西已经封装的很简单了,就一个类,里面有2个方法,2个属性,东西很少。
先直接上代码,然后再在下面解释一下。
.h文件什么都没写,直接.m文件了。
#import "ViewController.h"
#import <LocalAuthentication/LocalAuthentication.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)buttonClick:(UIButton *)sender {
LAContext *context = [[LAContext alloc] init];
// _context.localizedFallbackTitle = @"用密码登录";
// _context.maxBiometryFailures = @3;
NSError *error = nil;
BOOL isSupport = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
if (isSupport) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请通过Home键输入您的手机指纹密码" reply:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"指纹识别成功");
}else{
NSLog(@"%ld",error.code);
if (error.code == LAErrorAuthenticationFailed) {
NSLog(@"授权失败,指纹识别三次都错了。");
}
if (error.code == LAErrorUserCancel) {
NSLog(@"用户取消");
}
if (error.code == LAErrorUserFallback) {
NSLog(@"用户使用Fallback(用户用其他登陆方式了)");
}
if (error.code == LAErrorSystemCancel) {
NSLog(@"系统取消");
}
}
}];
}else{
}}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning];}if (error.code == LAErrorPasscodeNotSet) { NSLog(@"密码未设置"); } if (error.code == LAErrorTouchIDNotAvailable) { NSLog(@"touchID不可用"); } if (error.code == LAErrorTouchIDNotEnrolled) { NSLog(@"touchID未录入"); }
在使用touchID之前,先要导入
这个类中有2个方法,#import <LocalAuthentication/LocalAuthentication.h>
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError *__autoreleasing *)error;
该方法是用来判断设备是否支付指纹识别;
- (void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString *)localizedReason reply:(void(^)(BOOL success,NSError *error))reply;
该方法是用来识别指纹的。
按上面的代码写了后,运行,会看到如下效果:
在该图中,“指纹识别”四个字是App的名字,下面的一行字“请通过Home键输入您的手机指纹密码”是方法 - (void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString *)localizedReason reply:(void(^)(BOOL success, NSError *error))reply 中的localizedReason,这个字符串必须要写,不能为空,不然会崩。
这里面的LAPolicy分为两种:
- LAPolicyDeviceOwnerAuthenticationWithBiometrics
- 可以简单的理解为,基于 TouchID 的授权;若 Touch ID 不可用,将会授权失败。在后面我们会详细阐述这种授权方式
- Touch ID,将在错误输入 5 次后被锁定。锁定后,需要到手机锁屏界面输入密码来解锁
- LAPolicyDeviceOwnerAuthentication
- 支持两种授权方式,即:Touch ID 和 输入密码
- 优先以 Touch ID 方式进行授权,若Touch ID输入错误5次后,会弹出输入密码的界面
- 输入密码授权,将在错误输入 6 次后被锁定
- 若 Touch ID 和 输入密码都不用,将授权失败
如果指纹识别成功,那么就会进入if(success){}这个方法;
如果指纹识别不成功,那么就会进入else的方法中,失败的原因有很多。
在LAError中详细列出了这些失败的code,
//
// LAError.h
// LocalAuthentication
//
// Copyright (c) 2013 Apple. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <LocalAuthentication/LAPublicDefines.h>
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 = kLAErrorTouchIDNotAvailable,
/// Authentication could not start, because Touch ID has no enrolled fingers.
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,
} NS_ENUM_AVAILABLE(10_10, 8_0);
/// LocalAuthentication error domain.
extern NSString *const LAErrorDomain NS_AVAILABLE(10_10, 8_0);
指纹识别默认是3次机会,如果三次都失败了,那么输入指纹的这个AlertView就会dismiss。
#import <LocalAuthentication/LAContext.h>中有一个属性,
@property (nonatomic)NSNumber *maxBiometryFailuresNS_AVAILABLE(10_10,8_1);
就是用来设置其最大可失败次数的。
如果你指纹识别失败,会出现这个界面:
@property (nonatomic,copy)NSString *localizedFallbackTitle;
对,就是它!默认是Enter Password,输入密码。
如果你点了这个按钮,会进入
if (error.code ==LAErrorUserFallback) {
NSLog(@"用户使用Fallback(用户用其他登陆方式了)");
}
这个方法。
如果你三次指纹识别都失败了,AlertView消息,随后进入
if (error.code ==LAErrorAuthenticationFailed) {
NSLog(@"授权失败,指纹识别三次都错了。");
}
该方法,你可以对其进行其他操作。
OK,大致就这些了。