一.基本知识
点开这个LocalAuthentication.framework,发现里面主要有这么几个东西
LocalAuthentication.framework
- LAContext.h
- LAError.h
- LAPublicDefines.h
- LocalAuthentication.h
LocalAuthentication.h
这个没什么可讲的吧,代码就两行,一行导入LAContext.h,一行导入LAError.h,这个LocalAuthentication类是暴露出来方便开发者调用的类。
LAPublicDefines.h
先从简单的开始讲吧,首先是LAPublicDefines.h,从名字上来看是公共宏定义类,里面包含了许多定义好的宏,这些宏会在LAContext.h得到使用。
//// LAPublicDefines.h// LocalAuthentication//// Copyright (c) 2014 Apple. All rights reserved.//#ifndef LocalAuthentication_LAPublicDefines_h#define LocalAuthentication_LAPublicDefines_h// Policies#define kLAPolicyDeviceOwnerAuthenticationWithBiometrics 1#define kLAPolicyDeviceOwnerAuthentication 2// Options#define kLAOptionUserFallback 1#define kLAOptionAuthenticationReason 2// Credential types#define kLACredentialTypePasscode -1#define kLACredentialTypePassphrase -2#define kLACredentialCTKPIN -3// Error codes#define kLAErrorAuthenticationFailed -1#define kLAErrorUserCancel -2#define kLAErrorUserFallback -3#define kLAErrorSystemCancel -4#define kLAErrorPasscodeNotSet -5#define kLAErrorTouchIDNotAvailable -6#define kLAErrorTouchIDNotEnrolled -7#define kLAErrorTouchIDLockout -8#define kLAErrorAppCancel -9#define kLAErrorInvalidContext -10// Error domain#define kLAErrorDomain "com.apple.LocalAuthentication"#endifLAError.h
typedef NS_ENUM(NSInteger, LAError){LAErrorAuthenticationFailed, // 验证信息出错,就是说你指纹不对LAErrorUserCancel // 用户取消了验证LAErrorUserFallback // 用户点击了手动输入密码的按钮,所以被取消了LAErrorSystemCancel // 被系统取消,就是说你现在进入别的应用了,不在刚刚那个页面,所以没法验证LAErrorPasscodeNotSet // 用户没有设置TouchIDLAErrorTouchIDNotAvailable // 用户设备不支持TouchIDLAErrorTouchIDNotEnrolled // 用户没有设置手指指纹LAErrorTouchIDLockout // 用户错误次数太多,现在被锁住了LAErrorAppCancel // 在验证中被其他app中断LAErrorInvalidContext // 请求验证出错} NS_ENUM_AVAILABLE(10_10, 8_0);LAContext.h
typedef NS_ENUM(NSInteger, LAPolicy){LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_0) = kLAPolicyDeviceOwnerAuthentication} NS_ENUM_AVAILABLE(10_10, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0);第一个枚举LAPolicyDeviceOwnerAuthenticationWithBiometrics就是说,用的是手指指纹去验证的;NS_ENUM_AVAILABLE(NA, 8_0)iOS8 可用
第一次touchID 样式
错误后 touchID 样式
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));- (void)evaluatePolicy:(LAPolicy)policylocalizedReason:(NSString *)localizedReasonreply:(void(^)(BOOL success, NSError * __nullable error))reply;- (void)invalidate;枚举LACredentialType,LAAccessControlOperation,这个东西和下面的几个方法我查了很久也没弄明白用在哪,苹果官方文档也看的不太懂,枚举中只有一个LACredentialTypeApplicationPassword。
// 目前额外加密就一种就是应用密码// 输入进去将会是 UTF-8 的字符串typedef NS_ENUM(NSInteger, LACredentialType){LACredentialTypeApplicationPassword = 0,} NS_ENUM_AVAILABLE(10_11, 9_0);// 以下方法据我理解应该是:可以在验证Touch ID之后额外加密?// 设置解锁额外加密凭证- (BOOL)setCredential:(nullable NSData *)credentialtype:(LACredentialType)type NS_AVAILABLE(10_11, 9_0);// 判断加密凭证是否设置成功- (BOOL)isCredentialSet:(LACredentialType)type NS_AVAILABLE(10_11, 9_0);// 通过Touch ID来验证加密凭证是否通过- (void)evaluateAccessControl:(SecAccessControlRef)accessControloperation:(LAAccessControlOperation)operationlocalizedReason:(NSString *)localizedReasonreply:(void(^)(BOOL success, NSError * __nullable error))replyNS_AVAILABLE(10_11, 9_0);typedef NS_ENUM(NSInteger, LAAccessControlOperation){// 创建额外加密LAAccessControlOperationCreateItem,// 使用额外加密LAAccessControlOperationUseItem,// 创建额外加密keyLAAccessControlOperationCreateKey,// 使用额外加密key签名LAAccessControlOperationUseKeySign} NS_ENUM_AVAILABLE(10_11, 9_0);属性的话,这里有5个
@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;@property (nonatomic, nullable, copy) NSString *localizedCancelTitle NS_AVAILABLE(10_12, 10_0);@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState NS_AVAILABLE(10_11, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration NS_AVAILABLE(NA, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;localizedFallbackTitle可以设置验证TouchID时弹出Alert的输入密码按钮的标题
iOS 8 错误5次锁定后,第6次验证需要密码
支付宝微信对于锁定的不同处理
2. 指纹识别的LAPolicy
第一个枚举LAPolicyDeviceOwnerAuthenticationWithBiometrics就是说,用的是手指指纹去验证的;NS_ENUM_AVAILABLE(NA, 8_0)iOS8 可用
第二个枚举LAPolicyDeviceOwnerAuthentication少了WithBiometrics则是使用TouchID或者密码验证,默认是错误两次指纹或者锁定后,弹出输入密码界面;NS_ENUM_AVAILABLE(10_11, 9_0)
iOS 9可用
3. 指纹识别LAContext的方法
canEvaluatePolicy:error:方法用来检查当前设备是否可用touchID,返回一个BOOL值;不会弹验证指纹密码框
evaluatePolicy:localizedReason:reply:调用验证方法,会弹验证指纹密码框
4. feedback按钮显示
默认第一次识别只有取消按钮
错误一次之后,会显示 feedBack 按钮
如果不想显示 feedback 按钮;可以设置 feedBackTitle = @""
设置 feedbackTitle 为@""
设置 feedbackTitle 为@"验证登录密码"
5. CancelTitle按钮显示
该属性, iOS 10 才可以进行设置,iOS 以前是不可以进行设置的
6. 指纹识别慢的问题
我的 iphone 7 Plus指纹识别启动过程需要2s 左右的时间;如果发现启动比较慢,这个是正常现象
支付宝和微信为了消除用户的紧张情绪,在开启指纹识别的时候都有放 HUD
指纹识别完成后,需要返回主线程进行相应的 操作;否者你会发现有时候识别完4-5秒才有反应
微信支付 HUD显示案例
demo的 HUD显示案例
[SVProgressHUD show];LAContext *context = [[LAContext alloc]init];//使用 new 不会给一些属性初始化赋值context.localizedFallbackTitle = @"";//这样可以不让 feedBack 按钮显示//LAPolicyDeviceOwnerAuthenticationWithBiometrics[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请验证已有指纹" reply:^(BOOL success, NSError * _Nullable error) {[SVProgressHUD dismiss];//SVProgressHUD dismiss 需要 0.15才会消失;所以dismiss 后进行下一步操作;但是0.3是适当延长时间;留点余量dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{if (success){NSLog(@"指纹识别成功");// 指纹识别成功,回主线程更新UIdispatch_async(dispatch_get_main_queue(), ^{//成功操作});}if (error) {//指纹识别失败,回主线程更新UINSLog(@"指纹识别成功");dispatch_async(dispatch_get_main_queue(), ^{//失败操作});}});}];7.弹窗显示级别问题
- (void)applicationWillResignActive:(UIApplication *)application;- (void)applicationDidBecomeActive:(UIApplication *)application;所以应用程序内部无法获取。不知道越狱之后的手机能否获取到,如果能获取到,那就不可描述了,所以推荐各位看官没什么刚需不要越狱。
demo
TouchIDDemo
以上所述是小编给大家介绍的iOS中指纹识别常见问题汇总,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!