发布于 2年前

IOS实现TouchID和FaceID

IOS TouchID或FaceID核心实现

1.#import <LocalAuthentication/LocalAuthentication.h>

2.创建LAContext实例context

3.配置context的localizedFallbackTitle,为验证失败后的撤销操作

4.主要实现context的两个方法:

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

用于验证手机是否支持FaceID或TouchID

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

用于启动TouchID或FaceID验证

5.之后是处理验证后的回调操作,判断success确认验证是否通过,error.code来判断验证失败原因:

LAErrorSystemCancel:系统取消授权

LAErrorUserCancel:用户取消验证

LAErrorAuthenticationFailed:验证失败

LAErrorPasscodeNotSet:密码未设置

kLAErrorTouchIDNotAvailable:Touch ID尚未启用

kLAErrorTouchIDNotEnrolled:Touch ID尚未录入

代码:

//
//  ViewController.m
//  TouchIDDemo
//
//  Created by dave.luo on 2018/6/14.
//  Copyright © 2018年 dave.luo. All rights reserved.
//
#import "ViewController.h"
#import <LocalAuthentication/LocalAuthentication.h>
@interface ViewController ()
@end
@implementation ViewController
@synthesize context;
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    context = [LAContext new];
    context.localizedFallbackTitle = @"忘记密码";
    _result.hidden=YES;
    [self verifyTouchID];
}
-(void)verifyTouchID{
    NSError *error = nil;
    if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]){
        NSLog(@"支持指纹识别");
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指纹解锁" reply:^(BOOL success, NSError * _Nullable error) {
            if(success){
                NSLog(@"验证成功");
                dispatch_async(dispatch_get_main_queue(), ^{
                    _result.hidden=NO;
                    _result.text = @"验证成功";
                });
            }
            else{
                NSLog(@"%@",error.localizedDescription);
                dispatch_async(dispatch_get_main_queue(), ^{
                    _result.hidden=NO;
                    _result.text = @"验证失败";
                });
                switch (error.code) {
                    case LAErrorSystemCancel:
                    {
                        NSLog(@"系统取消授权");
                        break;
                    }
                    case LAErrorUserCancel:{
                        NSLog(@"用户取消验证");
                        break;
                    }
                    case LAErrorAuthenticationFailed:{
                        NSLog(@"验证失败");
                        break;
                    }
                    case LAErrorPasscodeNotSet:{
                        NSLog(@"密码未设置");
                        break;
                    }
                    case kLAErrorTouchIDNotAvailable:{
                        NSLog(@"Touch ID尚未启用");
                        break;
                    }
                    case kLAErrorTouchIDNotEnrolled:{
                        NSLog(@"Touch ID尚未录入");
                        break;
                    }
                    case kLAErrorUserFallback:{
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            NSLog(@"用户选择输入密码,切换主线程处理");
                        }];
                        break;
                    }
                    default:{
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            NSLog(@"其他情况,切换主线程处理");
                        }];
                        break;
                    }
                }
            }
        }];
    }else{
        NSLog(@"不支持指纹识别的设备");
        dispatch_async(dispatch_get_main_queue(), ^{
            _result.hidden=NO;
            _result.text = @"不支持指纹识别的设备";
        });
        switch (error.code) {
            case kLAErrorTouchIDNotEnrolled:
            {
                NSLog(@"TouchID is not enrolled");
                break;
            }
            case LAErrorPasscodeNotSet:
            {
                NSLog(@"A passcode has not been set");
                break;
            }
            default:
            {
                NSLog(@"TouchID not available");
                break;
            }
        }
    }
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
IOS
©2020 edoou.com   京ICP备16001874号-3