码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 关于TouchID指纹解锁的实现

时间:2017-09-28 18:07:05      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:隐藏   zip   title   设置密码   对象   edr   zed   ogr   blog   

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

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

#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的使用,需要输入手机的密码以解锁。还在研究。

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

 

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

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

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

iOS 关于TouchID指纹解锁的实现

标签:隐藏   zip   title   设置密码   对象   edr   zed   ogr   blog   

原文地址:http://www.cnblogs.com/weicyNo-1/p/7607690.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!