最近做了一个Touch ID的功能,添加到APP内,所以研究了一下,下面跟大家分享一下。
iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论上第三方软件不可使用。
在开始前,我们首先要做一下,依赖库的添加,这里给大家介绍一种新的方式,比较方便,不用先添加,然后在引用头文件,直接这样就可以了:
@import LocalAuthentication; 这个就Touch ID的依赖库。接下来就是要实现下面两个方法:
//是否可以用 Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;
//用Touch ID后,返回的结果,是否成功
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError *error))reply;
因为在使用
Touch ID前,我们必须使用
canEvaluatePolicy
验证该机器是否支持,不然会直接崩溃的。然后我们 使用
evaluatePolicy
方法启动传说中的指纹验证。接下来先给大家贴个验证操作的返回code列表:
typedef NS_ENUM(NSInteger, LAError){
//授权失败
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
//用户取消Touch ID授权
LAErrorUserCancel = kLAErrorUserCancel,
//用户选择输入密码
LAErrorUserFallback = kLAErrorUserFallback,
//系统取消授权(例如其他APP切入或者按home键时)
LAErrorSystemCancel = kLAErrorSystemCancel,
//系统未设置密码
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
//设备Touch ID不可用,例如未打开
LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable,
//设备Touch ID不可用,用户未录入
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,
}
其他的就不多说了看代码:
LAContext *context=[[LAContextalloc] init];
context.localizedFallbackTitle=@"";
NSError *err;
if([contextcanEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationerror:&err]){
NSLog(@"该设备支持Touch ID");
UIView *view=[[UIViewalloc] initWithFrame:CGRectMake(0,0, [UIScreenmainScreen].bounds.size.width, [UIScreenmainScreen].bounds.size.height)];
view.backgroundColor=[UIColorblackColor];
view.alpha=0.5;
[self.viewaddSubview:view];
[context isCredentialSet:LACredentialTypeApplicationPassword];
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationlocalizedReason:@"指纹验证"reply:^(BOOL success,NSError * _Nullable error) {
if(success)
{
NSLog(@"识别成功");
dispatch_async(dispatch_get_main_queue(), ^{
[view removeFromSuperview];
});
}
else
{
if(error.code==kLAErrorUserFallback)
{
NSLog(@"Fallback按钮被点击");
}
elseif (error.code==kLAErrorUserCancel)
{
NSLog(@"取消按钮被点击");
}
elseif (error.code==kLAErrorAppCancel)
{
NSLog(@"按home键推出");
}
else
{
NSLog(@"指纹识别失败%ld",error.code);
}
dispatch_async(dispatch_get_main_queue(), ^{
[view removeFromSuperview];
});
}
}];
}else{
NSLog(@"设备不支持Touch ID");
UIAlertController *alert = [UIAlertControlleralertControllerWithTitle:@"提示"message:@"设备不支持Touch ID"preferredStyle:UIAlertControllerStyleAlert];
[selfpresentViewController:alert animated:YEScompletion:nil];
UIAlertAction *action = [UIAlertActionactionWithTitle:@"确定"style:UIAlertActionStyleCancelhandler:^(UIAlertAction *_Nonnull action) {
isLock=NO;
}];
[alert addAction:action];
}
Demo地址就附在这里了:https://github.com/j521887/TouchID_OC