前言:如果图片看不了请移步:简书
首先苹果提供了canEvaluatePolicy:error:来判断运行的设备是否支持Touch ID
如果要让其失效,可以调用invalidate,新特征:iOS 9.0和Mac OS 10.11
还提供了evaluatePolicy:localizedReason:reply:来验证识别的情况,具体类型如下(以下枚举类型出现的情况均已测试并标注):
// 身份验证没有成功,因为用户未能提供有效的凭据(连续3次验证失败时提示) LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed, // 身份验证被用户取消(当用户点击取消按钮时提示) LAErrorUserCancel = kLAErrorUserCancel, // 认证被取消了,因为用户点击回退按钮(当用户点击输入密码时提示) LAErrorUserFallback = kLAErrorUserFallback, // 身份验证被系统取消(验证时当前APP被移至后台或者点击了home键导致验证退出时提示) LAErrorSystemCancel = kLAErrorSystemCancel, // Touch ID无法启动,因为没有设置密码(当系统没有设置密码的时候,Touch ID也将不会开启) LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet, // 无法启动身份验证(这种情况没有检测到,应该是出现硬件损坏才会出现) LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable, // 无法启动身份验证,因为触摸没有注册的手指 (这个暂时没检测到) LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled, // 身份验证是不成功的,因为有太多的失败会要求密码解除锁定,(前提是使用 LAPolicyDeviceOwnerAuthenticationWithBiometrics)iOS9和MAC OS0.11新特征 LAErrorTouchIDLockout NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorTouchIDLockout, // 认证被取消的应用(如无效而认证进行调用)这个暂时没有检测到,可能是苹果预留的 iOS9和MAC OS0.11新特征 LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel, // LAContext通过这个电话已经失效(当LAContext失效时会调用)iOS9和MAC OS0.11新特征 LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext首先,我们需要引入 LocalAuthentication 框架
#import <LocalAuthentication/LocalAuthentication.h>使用很简单,先创建一个LAContext对象并配置必要的信息
LAContext *context = [[LAContext alloc] init]; // 当指纹识别失败一次后,弹框会多出一个选项,而这个属性就是用来设置那个选项的内容 context.localizedFallbackTitle = @"使用密码登录";配置好LAContext对象后,就需要判断一下设备是否支持指纹识别功能
NSError *error = nil; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 该设备支持指纹识别 }else { }当设备支持指纹识别的时候,实现如下
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"身份验证需要解锁指纹识别功能" reply:^(BOOL success, NSError * _Nullable error) { if (success) { // 验证成功 }else { NSLog(@"%@", error.localizedDescription); switch (error.code) { case LAErrorSystemCancel: NSLog(@"身份验证被系统取消(验证时当前APP被移至后台或者点击了home键导致验证退出时提示)"); break; case LAErrorUserCancel: NSLog(@"身份验证被用户取消(当用户点击取消按钮时提示)"); break; case LAErrorAuthenticationFailed: NSLog(@"身份验证没有成功,因为用户未能提供有效的凭据(连续3次验证失败时提示)"); break; case LAErrorPasscodeNotSet: NSLog(@"Touch ID无法启动,因为没有设置密码(当系统没有设置密码的时候,Touch ID也将不会开启)"); break; case LAErrorTouchIDNotAvailable: NSLog(@"无法启动身份验证"); // 这个没有检测到,应该是出现硬件损坏才会出现 break; case LAErrorTouchIDNotEnrolled: NSLog(@"无法启动身份验证,因为触摸标识没有注册的手指"); // 这个暂时没检测到 break; case LAErrorUserFallback: { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"用户选择输入密码,切换主线程处理"); }]; break; } default: { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"其他情况,切换主线程处理"); // 5次失败进入,如果继续验证,则需要输入密码解锁 }]; break; } } } } ];如果不支持,实现如下
NSLog(@"不支持指纹识别"); switch (error.code) { case LAErrorTouchIDNotEnrolled: NSLog(@"设备Touch ID不可用"); break; case LAErrorPasscodeNotSet: NSLog(@"系统未设置密码"); break; default: NSLog(@"TouchID不可用或已损坏"); break; } NSLog(@"%@", error.localizedDescription);效果:
github-Demo下载请点我—— 如果太慢可以就点我下载
转载于:https://www.cnblogs.com/miaomiaoshen/p/5847341.html
