iOS 指纹解锁

2018-04-15  本文已影响96人  小兵快跑
Touch ID

最近公司的 APP 涉及到指纹识别这块,之前没有研究过,现在简单总结下...

1.基本知识点

1.需要导入 #import <LocalAuthentication/LocalAuthentication.h>

2.注意到这两个方法 
 //是否可以用 Touch ID 
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;

//用Touch ID后,返回的结果,是否成功
- (void)evaluatePolicy:(LAPolicy)policy
       localizedReason:(NSString *)localizedReason
                 reply:(void(^)(BOOL success, NSError * __nullable error))reply;

3.LAError.h(错误的类型)

typedef NS_ENUM(NSInteger, LAError)
{
    LAErrorAuthenticationFailed,    // 验证信息出错,就是说你指纹不对
    LAErrorUserCancel               // 用户取消了验证
    LAErrorUserFallback             // 用户点击了手动输入密码的按钮,所以被取消了
    LAErrorSystemCancel             // 被系统取消,就是说你现在进入别的应用了,不在刚刚那个页面,所以没法验证
    LAErrorPasscodeNotSet           // 用户没有设置TouchID
    LAErrorTouchIDNotAvailable      // 用户设备不支持TouchID
    LAErrorTouchIDNotEnrolled       // 用户没有设置手指指纹
    LAErrorTouchIDLockout           // 用户错误次数太多,现在被锁住了
    LAErrorAppCancel                // 在验证中被其他app中断
    LAErrorInvalidContext           // 请求验证出错
} NS_ENUM_AVAILABLE(10_10, 8_0);

4.LAContext 属性

@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle NS_AVAILABLE(10_12, 10_0);
@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState NS_AVAILABLE(10_11, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration NS_AVAILABLE(10_12, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic, copy) NSString *localizedReason API_AVAILABLE(macos(10.13), ios(11.0)) API_UNAVAILABLE(watchos, tvos);


localizedFallbackTitle可以设置验证TouchID时弹出Alert的输入密码按钮的标题
localizedCancelTitle可以设置验证TouchID时弹出Alert的取消按钮的标题(iOS10才有)
maxBiometryFailures 最大指纹尝试错误次数。 这个属性我们可以看到他后面写了NS_DEPRECATED_IOS(8_3, 9_0),说明这个属性在iOS 8.3被引入,在iOS 9.0被废弃,所以如果系统版本高于9.0是无法使用的。
evalueatedPolicyDomainState这个跟可以检测你的指纹数据库的变化,增加或者删除指纹这个属性会做出相应的反应
touchIDAuthenticationAllowableReuseDuration这个属性应该是类似于支付宝的指纹开启应用,如果你打开他解锁之后,按Home键返回桌面,再次进入支付宝是不需要录入指纹的。因为这个属性可以设置一个时间间隔,在时间间隔内是不需要再次录入。默认是0秒,最长可以设置5分钟。

5.支持机型判断

从设备和系统判断是否是支持TouchID

1.是否是iOS8.0以上的系统
2.是否是5s以上的设备支持

2.代码

  if([NSString judueIPhonePlatformSupportTouchID]){
        
        LAContext *la = [[LAContext alloc] init];
        la.localizedCancelTitle = @"cancel.."; // 自定义 左边 title
        la.localizedFallbackTitle = @"fallTitle.."; // 自定义 右边 title
        
        NSError *error;
        
        if([la canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]){
            
            [la evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"手机指纹验证..." reply:^(BOOL success, NSError * _Nullable error) {
                
                if(success){
                 
                    NSLog(@"验证 Success");
                    
                }else{
                    switch (error.code)
                    {
                            
                        case LAErrorUserCancel:
                            //认证被用户取消.例如点击了 cancel 按钮.
                            NSLog(@"密码取消");
                            break;
                            
                        case LAErrorAuthenticationFailed:
                            // 此处会自动消失,然后下一次弹出的时候,又需要验证数字
                            // 认证没有成功,因为用户没有成功的提供一个有效的认证资格
                            NSLog(@"连输三次后,密码失败");
                            break;
                            
                        case LAErrorPasscodeNotSet:
                            // 认证不能开始,因为此台设备没有设置密码.
                            NSLog(@"密码没有设置");
                            break;
                            
                        case LAErrorSystemCancel:
                            //认证被系统取消了(例如其他的应用程序到前台了)
                            NSLog(@"系统取消了验证");
                            break;
                            
                        case LAErrorUserFallback:
                            //当输入觉的会有问题的时候输入
                            NSLog(@"登陆");
                            break;
                        case LAErrorTouchIDNotAvailable:
                            //认证不能开始,因为 touch id 在此台设备尚是无效的.
                            NSLog(@"touch ID 无效");
                            
                        default:
                            NSLog(@"您不能访问私有内容");
                            break;
                    }
                }
            }];
            
        }else{
            
            switch (error.code) {
                case LAErrorTouchIDNotEnrolled:
                    NSLog(@"您还没有进行指纹输入,请指纹设定后打开");
                    break;
                case  LAErrorTouchIDNotAvailable:
                    NSLog(@"您的设备不支持指纹输入,请切换为数字键盘");
                    break;
                case LAErrorPasscodeNotSet:
                    NSLog(@"您还没有设置密码输入");
                    break;
                default:
                    break;
            }
        }
    }
   

完成这篇功能总结,指纹解锁实现起来还是很简单的,苹果都已经封装好了,简单实现几个方法就好。

Github

上一篇下一篇

猜你喜欢

热点阅读