简介

苹果从iPhone5S开始,具有指纹识别技术,从iOS8.0之后苹果允许第三方 App 使用 Touch ID进行身份验证。指纹识别Touch ID提供3+2共5次指纹识别机会(3次识别失败后,弹出的指纹验证框会消失,同时会报错code = -1,然后点击指纹会再次弹框可验证两次),如果五次指纹识别全部错误,就需要手动输入数字密码,数字密码可以输入6次,如果6次输入的数字密码都错误,系统会停止验证,一定的间隔后才能再次输入密码验证,而且间隔会随着输入的次数增长。

使用方法

1.首先导入框架LocalAuthentication
2.判断系统版本,最低iOS 8.0
3.创建验证对象上下文LAContext
4.判断指纹识别技术是否可用canEvaluatePolicy
5.如果可用,开始调用方法开始使用指纹识别

#import <LocalAuthentication/LocalAuthentication.h>
//指纹按钮
- (void)showFingerprintTouch
{
//系统支持,最低iOS 8.0
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0)
{
LAContext * context = [[LAContext alloc] init];
NSError * error;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])
{ //localizedReason: 指纹识别出现时的提示文字
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指纹解锁" reply:^(BOOL success, NSError * _Nullable error) { if (success)
{
//识别成功
dispatch_async(dispatch_get_main_queue(), ^{
//在主线程中,处理 ......
});
}
else if (error)
{
NSLog(@"LAPolicyDeviceOwnerAuthenticationWithBiometrics -- %@",error);
} }]; }
else if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:nil])
{
[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"密码解锁" reply:^(BOOL success, NSError * _Nullable error){ NSLog(@"LAPolicyDeviceOwnerAuthentication -- %@", error); }];
}
NSLog(@" --- %@ ", error);
}
}

代码解析

指纹识别的策略

[context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil] [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:nil]

  • LAPolicyDeviceOwnerAuthenticationWithBiometrics ,指纹授权使用, 当设备不具有Touch ID的功能,或者在系统设置中没有设置开启指纹,授权将会失败。当指纹验证3+2次都没有通过的时候指纹验证就会被锁定,就需要先进行数字密码的解锁才能继续使用指纹密码。
  • LAPolicyDeviceOwnerAuthentication,指纹和数字密码的授权使用,当指纹可用且没有被锁定,授权后会进入指纹密码验证。不然的话会进入数字密码验证的页面。当系统数字密码没有设置不可用的时候,授权失败。如果数字密码输入不真确,连续6次输入数字密码都不真确后,会停用鉴定过一定的间隔后才能使用,间隔时间依次增长,如图:


  • 弹出的指纹验证框的两个按钮的标题,可以通过下面的方法修改:
    context.localizedCancelTitle = @"取消";
    context.localizedFallbackTitle = @"输入密码";
  • localizedReason:是用来设置弹出框的提示内容的,一般写的是是用原因,如图:

     

     
     
     
     
    //详细介绍

    //创建LAContext(指纹验证操作对象)

    LAContext *context = [LAContext new];

    //这个属性是设置指纹输入 失败 之后的弹出框的选项

    context.localizedFallbackTitle = @"没有忘记密码";

    NSError *error = nil;

    //    使用canEvaluatePolicy  ,判断设备支持状态

    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {

    NSLog(@"支持指纹识别");

    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请按home键指纹解锁" reply:^(BOOL success, NSError * _Nullable error) {

    if (success) {

    NSLog(@"验证成功 刷新主界面");

    }else{

    NSLog(@"错误:%@",error.localizedDescription);

    switch (error.code) {

    case LAErrorSystemCancel:

    {

    NSLog(@"系统取消授权,如其他APP切入");

    break;

    }

    case LAErrorUserCancel:

    {

    NSLog(@"用户取消验证Touch ID");

    break;

    }

    case LAErrorAuthenticationFailed:

    {

    NSLog(@"授权失败");

    break;

    }

    case LAErrorPasscodeNotSet:

    {

    NSLog(@"系统未设置密码");

    break;

    }

    case LAErrorTouchIDNotAvailable:

    {

    NSLog(@"设备Touch ID不可用,例如未打开");

    break;

    }

    case LAErrorTouchIDNotEnrolled:

    {

    NSLog(@"设备Touch ID不可用,用户未录入");

    break;

    }

    case LAErrorUserFallback:

    {

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{

    NSLog(@"用户选择输入密码,切换主线程处理");

    }];

    break;

    }

    default:

    {

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{

    NSLog(@"其他情况,切换主线程处理");

    }];

    break;

    }

    }

    }

    }];

    }else{

    NSLog(@"不支持指纹识别");

    switch (error.code) {

    case LAErrorTouchIDNotEnrolled:

    {

    NSLog(@"TouchID is not enrolled");

    break;

    }

    case LAErrorPasscodeNotSet:

    {

    NSLog(@"A passcode has not been set");

    break;

    }

    default:

    {

    NSLog(@"TouchID not available");

    break;

    }

    }

    NSLog(@"%@",error.localizedDescription);

    }


												

最新文章

  1. 快速删除.svn文件夹
  2. java.util.zip.ZipException: invalid entry size 解决办法
  3. 这些javascript面试题,你做对了几道?
  4. [troubleshoot][archlinux][X] GPU HANG
  5. bootstrap插件学习-bootstrap.popover.js
  6. How to Kill All Processes That Have Open Connection in a SQL Server Database[关闭数据库链接 最佳方法] -摘自网络
  7. 第二次装OA系统
  8. django 学习 --- 环境搭建
  9. SQLServer 2000 Driver for JDBC][SQLServer]传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确解决方法
  10. Agile/CMMI/Scrum
  11. easyUI tree点击文字展开节点
  12. 借助csv用PHP生成excel文件
  13. itchat 微信的使用
  14. 通过ldap验证svn服务
  15. InnoDB Insert Buffer(插入缓冲)
  16. JS隐藏号码中间4位
  17. Linux里文件和文件夹权限的含义
  18. DoTween的用法
  19. Cocos2dx网络读取图片
  20. 【JMeter】【性能测试】分布式远程服务器

热门文章

  1. ASP.NET MVC中使用异步控制器
  2. 浅谈js代码规范
  3. HDU1392(凸包)
  4. venom结合Metasploit绕过360安全卫士
  5. Redis 提供的好的解决方案 实例
  6. 正则表达式之一:TSQL注释的查找
  7. We Chall-Prime Factory-Writeup
  8. php类与构造函数解析
  9. 纯js实现html转pdf
  10. FTP与TFTP