zoukankan      html  css  js  c++  java
  • iOS 关于TouchID指纹解锁的实现

    转载请注明出处!!!  

    一直想玩玩指纹解锁,近期时间比较闲,就研究了一下这个指纹解锁。这个功能实现起来还是很简单的,虽然看起来比较高大上,但是对于开发来说,越是高大上的东西一般都有封装好的,我们只需要调用就可以实现相当秀的功能。
      废话少说,直接贴教程。
      苹果公司推出的指纹识别,提供的功能很少,只要注意这两个功能即可(验证是否支持指纹以及指纹是否正确)。

      第一步:导入解锁必须的头文件

    #import <LocalAuthentication/LocalAuthentication.h>

      第二步:(这一步主要是了解使用的方法,可以直接跳过看第三步的代码)

      这个方法是判断设备是否支持TouchID的。

    1
    2
    - (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)
    error __attribute__((swift_error(none)));

      这个是用来验证TouchID的,会有弹出框出来。

    1
    2
    3
    - (void)evaluatePolicy:(LAPolicy)policy
           localizedReason:(NSString *)localizedReason
                     reply:(void(^)(BOOL success, NSError * __nullable error))reply;
     

      LAContext对象,这个主要设置的属性是localizedFallbackTitle。这个是用于设置左边的按钮的名称,默认是Enter Password.当你设置为@“”时会隐藏。还可以设置localizedReason这个属性,这是用于设置提示语,表示为什么要使用Touch ID。

      第三步:(整体代码)

    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        //初始化上下文对象
        LAContext* context = [[LAContext alloc] init];
        //这个设置的使用密码的字体,当text=@""时,按钮将被隐藏
    

        context.localizedFallbackTitle=@"输入密码解锁";

    //这个设置的取消按钮的内容
        context.localizedCancelTitle=@"取消";
        //错误对象
        NSError* error = nil;
        NSString* result = @"需要验证您的touch ID";
        //首先使用canEvaluatePolicy 判断设备支持状态
        if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                                 error:&error]) {
            NSLog(@"支持指纹识别");
            [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                    localizedReason:result 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.touch ID 在验证连续错误三次的时候,会停止touch ID的使用,需要输入手机的密码以解锁。这个要如何实现呢?这个是要通过一个枚举修改的。

    第一个枚举LAPolicyDeviceOwnerAuthenticationWithBiometrics就是说,用的是手指指纹去验证的;NS_ENUM_AVAILABLE(NA, 8_0)iOS8 可用
    第二个枚举LAPolicyDeviceOwnerAuthentication少了WithBiometrics则是使用TouchID或者密码验证,默认是错误两次指纹或者锁定后,弹出输入密码界面;NS_ENUM_AVAILABLE(10_11, 9_0)iOS 9可用

    [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication
                    localizedReason:result reply:^(BOOL success, NSError * _Nullable error) {
    }

    2.在使用的过程中,在block回调中使用了LCProgressHUD,但是界面出现了卡死的现象,通过视图层级下,发现是由于LCProgressHUD的界面没有清除,导致整个界面被它覆盖,形成卡死假象。这是别人遇到的问题,Mark一下,防止以后出错。

    3.feedback按钮显示

    1. 默认第一次识别只有取消按钮
    2. 错误一次之后,会显示 feedBack 按钮
    3. 如果不想显示 feedback 按钮;可以设置 feedBackTitle = @""

    4.CancelTitle按钮显示

    该属性, iOS 10 才可以进行设置,iOS 以前是不可以进行设置的

    参考链接:1.http://www.jianshu.com/p/0690a96ad5f6

         2.http://blog.csdn.net/zzzzzdddddxxxxx/article/details/53513909

           3.http://blog.csdn.net/ZzzzzzXJ/article/details/43989235

    附件Demo:其中包含我的小demo和一个封装好的类touchID.zip 

  • 相关阅读:
    Pycharm的快捷键
    【Python】笔记1:Spyder常用快捷键
    npm常用命令整理
    MVC4 IIS7.5 403.14错误的解决办法
    AO 获取系统自带的工具条
    CentOS 7.3下安装Redis
    CentOS 7.3下安装MySql
    安装sql server 2005时出现“安装汇编”错误的解决办法
    解决IIS下localhost访问需要输入用户名和密码的问题
    不断沟通,反复确认
  • 原文地址:https://www.cnblogs.com/weicyNo-1/p/7607690.html
Copyright © 2011-2022 走看看