Touch ID
Touch
ID是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术。大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密
码进行验证。一方面不用担心密码被别人看到,另一方面也方便了自己的操作。iOS8后苹果开放了Touch
ID的API给开发者,这也给我们的app带来了新的体验。
使用
Touch ID的API非常的简单也好理解,在使用前我们需要导入LocalAuthentication这个库。
1.png
首先来看下头文件的定义:
//验证设备是否支持Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError* __autoreleasing *)error;
//进行验证的回调
- (void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString*)localizedReason reply:(void(^)(BOOLsuccess,NSError*error))reply;
//取消Touch Id验证的按钮的标题,默认标题是输入密码@property(nonatomic,copy)NSString*localizedFallbackTitle;
代码使用示例
LAContext *laContext = [[LAContext alloc] init];
NSError*error;
if([laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])
{
[laContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Touch Id Test"reply:^(BOOLsuccess,NSError*error) {
if(success)
{NSLog(@"success to evaluate");//do your work}
if(error)
{NSLog(@"---failed to evaluate---error: %@---", error.description);//do your error handle} }]; }
else{NSLog(@"==========Not support :%@", error.description);//do your error handle}
这样我们就完成了一个Touch ID的验证功能。当我们点击按钮进行调用的时候,就会弹出验证的对话框:
2.png
弹窗目前还不能自定义,都是统一的,第一行是app的名字+Touch ID, 第二行是需要用Touch ID的理由。在用户进行操作后,我们可以在回调的block那边处理自己的业务逻辑。
错误处理
typedefNS_ENUM(NSInteger, LAError){//用户验证没有通过,比如提供了错误的手指的指纹LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,// 用户取消了Touch ID验证LAErrorUserCancel = kLAErrorUserCancel,//用户不想进行Touch ID验证,想进行输入密码操作
LAErrorUserFallback = kLAErrorUserFallback,// 系统终止了验证
LAErrorSystemCancel = kLAErrorSystemCancel,// 用户没有在设备Settings中设定密码LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,// 设备不支持Touch IDLAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable,// 设备没有进行Touch ID 指纹注册
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,}NS_ENUM_AVAILABLE(10_10,8_0);
在block回调那边,我们需要对每种错误进行处理,以便得到更好的用户体验。
例
#import "ViewController.h"#import@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
btn.center=self.view.center;
btn.bounds=CGRectMake(0, 0, 100, 40);
[btn setTitle:@"指纹识别" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[self.view addSubview:btn];
[btn addTarget:self action:@selector(clickTouchId) forControlEvents:UIControlEventTouchUpInside];
}
-(void)clickTouchId
{
CGFloat systemVersion=[UIDevice currentDevice].systemVersion.doubleValue;
if (systemVersion>=8.0)
{
LAContext *context=[[LAContext alloc]init];
NSError *error=nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"XX请求验证" reply:^(BOOL success, NSError * _Nullable error) {
if (success)
{
NSLog(@"验证成功");
}
switch (error.code)
{
case LAErrorSystemCancel:
NSLog(@"切换到其它app,系统取消验证");
break;
case LAErrorUserCancel:
NSLog(@"用户取消验证");
break;
case LAErrorUserFallback:
NSLog(@"用户选择输入密码,切换主线程处理");
break;
}
}];
}
if (error)
{
NSLog(@"%@",error.localizedDescription);
}
}
}