iOS_使用LAContext实现TouchID(指纹识别)的使

作者: Mark_Ming | 来源:发表于2016-06-17 16:20 被阅读2082次
    在iPhone5s问世后,苹果的后续移动设备相继添加了指纹功能,从实际使用中还是相当方便的,比如快捷支付、快捷登录等应用场景,系统也提供给了我们相关的操作框架:LocalAuthentication,使用LAContext对象即可完成指纹识别,由于指纹识别时遇到的情况也比较多,所以我做了相应的封装,代码具体如下:

    提示:指纹识别必须用真机测试

    -点击下载工程

    LM_TouchID.h 内容:

    //
    //  LM_TouchID.h
    //  TouchID
    //
    //  Created by CoderDoctorLee on 16/6/16.
    //  Copyright © 2016年 CoderDoctorLee. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    #import <LocalAuthentication/LocalAuthentication.h>
    
    @protocol LM_TouchID_Delegate <NSObject>
    //必须实现的两个代理方法:
    @required
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:06
     *
     *  验证成功
     */
    - (void)LM_TouchID_AuthorizeSuccess;
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:41
     *
     *  验证失败
     */
    - (void)LM_TouchID_AuthorizeFailure;
    
    //选择实现的代理方法:
    @optional
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:12
     *
     *  取消了验证(点击了取消)
     */
    - (void)LM_TouchID_AuthorizeUserCancel;
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:58
     *
     *  在TouchID对话框点击输入密码按钮
     */
    - (void)LM_TouchID_AuthorizeUserFallBack;
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:58
     *
     *   在验证的TouchID的过程中被系统取消 例如突然来电话、按了Home键、锁屏...
     */
    - (void)LM_TouchID_AuthorizeSystemCancel;
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:18
     *
     *  无法使用TouchID,设备没有设置密码
     */
    - (void)LM_TouchID_AuthorizePasswordNotSet;
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:15
     *
     *  没有录入TouchID,无法使用
     */
    - (void)LM_TouchID_AuthorizeTouchIDNotSet;
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:19
     *
     *  该设备的TouchID无效
     */
    - (void)LM_TouchID_AuthorizeTouchIDNotAvailable;
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:17
     *
     *  多次连续使用Touch ID失败,Touch ID被锁,需要用户输入密码解锁
     */
    - (void)LM_TouchID_AuthorizeTouchIDNotLockOut;
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:47
     *
     *  当前软件被挂起取消了授权(如突然来了电话,应用进入前台)
     */
    - (void)LM_TouchID_AuthorizeTouchIDAppCancel;
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:45
     *
     *  当前软件被挂起取消了授权 (授权过程中,LAContext对象被释)
     */
    - (void)LM_TouchID_AuthorizeTouchIDInvalidContext;
    
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:29
     *
     *  当前设备不支持指纹识别
     */
    - (void)LM_TouchID_AuthorizeNotSupport;
    @end
    
    @interface LM_TouchID : LAContext
    @property (nonatomic, assign) id<LM_TouchID_Delegate> delegate;
    /**
     *  @author CoderDoctorLee, 16-06-16 22:06:51
     *
     *  发起指纹验证:
     */
    - (void)startLM_TouchID_WithMessage:(NSString *)message FallBackTitle:(NSString *)fallBackTitle Delegate:(id<LM_TouchID_Delegate>)delegate;
    @end
    

    LM_TouchID.m 内容:

    //
    //  LM_TouchID.m
    //  TouchID
    //
    //  Created by CoderDoctorLee on 16/6/16.
    //  Copyright © 2016年 CoderDoctorLee. All rights reserved.
    //
    
    #import "LM_TouchID.h"
    
    @implementation LM_TouchID
    - (void)startLM_TouchID_WithMessage:(NSString *)message FallBackTitle:(NSString *)fallBackTitle Delegate:(id<LM_TouchID_Delegate>)delegate
    {
        LAContext *context = [[LAContext alloc] init];
        context.localizedFallbackTitle = fallBackTitle;
        
        NSError *error = nil;
        self.delegate = delegate;
        //判断代理人是否为空
        if (self.delegate != nil) {
            if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
                //使用context对象对识别的情况进行评估
                [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:message reply:^(BOOL success, NSError * _Nullable error) {
                    //识别成功:
                    if (success) {
                        if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeSuccess)]) {
                            //必须回到主线程执行,否则在更新UI时会出错!以下相同
                            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                [self.delegate LM_TouchID_AuthorizeSuccess];
                            }];
                        }
                    }
                    //识别失败(对应代理方法的每种情况,不实现对应方法就没有反应)
                    else if (error)
                    {
                        switch (error.code) {
                            case LAErrorAuthenticationFailed:{
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeFailure)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                    [self.delegate LM_TouchID_AuthorizeFailure];
                                    }];
                                }
                                break;
                            }
                            case LAErrorUserCancel:{
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeUserCancel)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                    [self.delegate LM_TouchID_AuthorizeUserCancel];
                                    }];
                                }
                                break;
                            }
                            case LAErrorUserFallback:{
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeUserFallBack)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                    [self.delegate LM_TouchID_AuthorizeUserFallBack];
                                    }];
                                }
                                break;
                            }
                            case LAErrorSystemCancel:{
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeSystemCancel)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                    [self.delegate LM_TouchID_AuthorizeSystemCancel];
                                    }];
                                }
                                break;
                            }
                            case LAErrorTouchIDNotEnrolled:
                            {
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDNotSet)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                    [self.delegate LM_TouchID_AuthorizeTouchIDNotSet];
                                    }];
                                }
                                break;
                            }
                            case LAErrorPasscodeNotSet:{
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizePasswordNotSet)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                    [self.delegate LM_TouchID_AuthorizePasswordNotSet];
                                    }];
                                }
                                break;
                            }
                            case LAErrorTouchIDNotAvailable:{
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDNotAvailable)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                        [self.delegate LM_TouchID_AuthorizeTouchIDNotAvailable];
                                    }];
                                }
                                break;
                            }
                            case LAErrorTouchIDLockout:{
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDNotLockOut)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                        [self.delegate LM_TouchID_AuthorizeTouchIDNotLockOut];
                                    }];
                                }
                                break;
                            }
                            case LAErrorAppCancel:{
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDAppCancel)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                        [self.delegate LM_TouchID_AuthorizeTouchIDAppCancel];
                                    }];
                                }
                                break;
                            }
                            case LAErrorInvalidContext:{
                                if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeTouchIDInvalidContext)]) {
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                        [self.delegate LM_TouchID_AuthorizeTouchIDInvalidContext];
                                    }];
                                }
                                break;
                            }
                            default:
                                break;
                        }
                    }
                }];
            }
        }
        //设备不支持指纹识别
        else
        {
            if ([self.delegate respondsToSelector:@selector(LM_TouchID_AuthorizeNotSupport)]) {
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    [self.delegate LM_TouchID_AuthorizeNotSupport];
                }];
            }
        }
    }
    @end
    

    在ViewController里使用示例:

    //
    //  ViewController.m
    //  TouchID
    //
    //  Created by CoderDoctorLee on 16/6/17.
    //  Copyright © 2016年 CoderDoctorLee. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "LM_TouchID.h"
    @interface ViewController ()<LM_TouchID_Delegate>
    @property(nonatomic, strong)UILabel *label;
    @property(nonatomic, strong)LM_TouchID *touchID;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //用来显示验证信息
        self.label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 175, 50)];
        _label.backgroundColor = [UIColor blueColor];
        _label.textColor = [UIColor whiteColor];
        [self.view addSubview:_label];
        
        self.touchID = [[LM_TouchID alloc] init];
        //开始验证:
        [_touchID startLM_TouchID_WithMessage:@"请验证指纹转账100万" FallBackTitle:@"输入密码" Delegate:self];
    }
    - (void)LM_TouchID_AuthorizeSuccess
    {
        _label.text = @"验证成功";
    }
    - (void)LM_TouchID_AuthorizeFailure
    {
        _label.text = @"验证失败";
    }
    - (void)LM_TouchID_AuthorizeNotSupport
    {
        _label.text = @"设备不支持";
    }
    - (void)LM_TouchID_AuthorizeUserCancel
    {
        _label.text = @"用户取消了验证";
    }
    //其他代理方法就不一一实现了,大家可以自行测验
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    
    

    相关文章

      网友评论

      • 6e080f4a6965:楼主,有一个问题要请教你,就是当我三次输入指纹失败后,弹出系统密码输入框,密码输入正确时候不是解锁TOUCH ID的吗? 为什么密码输入成功也会走指纹验证成功的那个方法里?怎么判断是密码输入成功还是指纹验证成功?
        小星星吃KFC:@一起看硫酸雨 请问 这个需求 你解决了吗?
        6e080f4a6965:@点滴生活 找到解决的办法了
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication
        localizedReason:@"请验证已有指纹"
        reply:^(BOOL success, NSError * _Nullable error) {
        if (success) {
        if ([context evaluatedPolicyDomainState] != nil) {
        NSLog(@"指纹验证成功");
        }else{
        NSLog(@"TOUCH ID 解锁成功"); //系统密码输入成功
        }
        } else {
        NSLog(@"指纹验证失败:\n\n%@", error.userInfo[NSLocalizedDescriptionKey]);
        }
        }];
      • 大斜的张:为什么 你的代理方法都不走.[context canEvaluatePolicy]返回值为NO呢
      • 追你的小豪:ios 10 touchID 输错五次后 不弹出 输入系统密码的控制器 10以下就是好的 但是 支付宝 好像会弹出来 请回复我
        小星星吃KFC:请问 这个需求 你解决了吗?
        Mark_Ming:@追你的小豪 sorry,我的手机还没升级到iOS10.0,升级完我解决一下

      本文标题:iOS_使用LAContext实现TouchID(指纹识别)的使

      本文链接:https://www.haomeiwen.com/subject/xcevdttx.html