iOS 8 SDK向开发者公布了Touch ID指纹识别功能,允许App对用户身份进行本地验证。
iOS系统的Touch ID指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8.
LocalAuthentication.framework
该框架下只有两个头文件:
LAContext.h
LAError.h
通过该对象可完成指纹识别。
typedef NS_ENUM(NSInteger, LAPolicy)
{
// 指纹验证
LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,
// 使用Touch ID或者密码验证,默认是错误两次指纹或者锁定后,弹出输入密码界面
LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_0) = kLAPolicyDeviceOwnerAuthentication
};
// 回退按钮标题
// 默认标题为“输入密码”,当设置成空字符串的时候,该按钮被隐藏
@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;
// 取消按钮标题
// 设置验证TouchID时弹出Alert的取消按钮的标题
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle;
// 允许验证失败最大次数
@property (nonatomic, nullable) NSNumber *maxBiometryFailures;
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState;
// 指定TouchID验证的间隔,间隔期之内可以免验证读取Keychain数据
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration;
// 判断设备是否支持Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
// 验证身份的函数
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
主要用于Touch ID验证身份失败后的一些错误处理。
typedef NS_ENUM(NSInteger, LAError)
{
// 授权失败
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
// 用户取消Touch ID授权
LAErrorUserCancel = kLAErrorUserCancel,
// 用户选择输入密码
LAErrorUserFallback = kLAErrorUserFallback,
// 系统取消授权(例如其他APP切入)
LAErrorSystemCancel = kLAErrorSystemCancel,
// 系统未设置密码
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
// 设备Touch ID不可用,例如未打开
LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable,
// 设备Touch ID不可用,用户未录入
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,
// 用户多次连续使用Touch ID失败,Touch ID被锁,需要用户输入密码解锁,这个错误的交互LocalAuthentication.framework已封装过,不需要开发者处理
LAErrorTouchIDLockout NS_ENUM_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAErrorTouchIDLockout,
// 与LAErrorSystemCancel相似,都是当前软件被挂起取消了授权,LAErrorAppCancel该错误是用户自己切到了别的应用,例如按Home键挂起。
LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,
// 授权过程中,LAContext对象被释放掉了,造成的授权失败
LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext
}
//新建LAContext实例
LAContext *authenticationContext= [[LAContext alloc]init];
authenticationContext.localizedFallbackTitle = @"点,验证其他";
NSError *error;
//1:检查Touch ID 是否可用
if ([authenticationContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
NSLog(@"touchId 可用");
//2:执行认证策略
[authenticationContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"需要验证您的指纹来确认您的身份信息" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"通过了Touch Id指纹验证");
}else{
NSLog(@"error===%@",error);
switch (error.code) {
case LAErrorAuthenticationFailed:{//授权失败
NSLog(@"Authentication Failed");
break;
}
case LAErrorUserCancel:{// 用户取消Touch ID授权
NSLog(@"Authentication was cancelled by the user");
break;
}
case LAErrorUserFallback:{//用户选择输入密码
NSLog(@"User selected to enter custom password");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// TODO SOMETHING
}];
break;
}
case LAErrorSystemCancel:{//系统取消授权(例如其他APP切入)
NSLog(@"Authentication was cancelled by the system");
//切换到其他APP,系统取消验证Touch ID
break;
}
case LAErrorAppCancel:{//与LAErrorSystemCancel相似,都是当前软件被挂起取消了授权,LAErrorAppCancel该错误是用户自己切到了别的应用,例如按Home键挂起。
NSLog(@"app cancle the authentication");
break;
}
case LAErrorInvalidContext:{//授权过程中,LAContext对象被释放掉了,造成的授权失败
NSLog(@"context is invalidated");
break;
}
default:{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//其他情况,切换主线程处理
}];
break;
}
}
}
}];
}else{
//todo goto 输入密码页面
NSLog(@"error====%@",error);
NSLog(@"抱歉,touchId 不可用");
}
Demo地址