添加TouchID支持(指纹识别)

2017-09-02  本文已影响5人  shiyuwudi
-(void)finger {
    LAContext *context = [LAContext new];
    context.localizedFallbackTitle = @"";
    NSString *reasonStr = @"需要验证指纹才能进一步操作";
    NSError *err;
    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&err]) {
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:reasonStr reply:^(BOOL success, NSError * _Nullable evalPolicyError) {
            if (success) {
                NSLog(@"授权成功");
                //开始绑定
                [self bind];
            }else {
                switch (evalPolicyError.code) {
                    case LAErrorSystemCancel:{
                        [self failedPrompt:@"系统取消授权"];
                        break;
                    }
                    case LAErrorUserCancel:{
                        [self failedPrompt:@"用户取消授权"];
                        break;
                    }
                    default:{
                        [self failedPrompt:@"授权失败"];
                        break;
                    }
                }
            }
        }];
    } else {
        NSString *str = @"";
        switch (err.code) {
            case LAErrorTouchIDNotEnrolled:{
                str = @"没有注册指纹";
                break;
            }
            case LAErrorPasscodeNotSet:{
                str = @"没有注册指纹验证码";
                break;
            }
            default:
                //LAErrorTouchIDNotAvailable
                str = @"指纹识别不可用";
        }
        [self failedPrompt:str];
    }
}

开门见山。如上贴出指纹识别的一些关键代码,其实就是围绕着LAContext做文章。LA就是Local Authentication的缩写,也就是本地授权。所有成功和失败的情况已经全部体现在代码中。值得注意的是用户输入错误3次以上就会提示输入指纹验证码,也就是iOS设备注册指纹的时候以防万一的备用code。这个code如果通过的话也算是验证成功,如果想要禁用掉这个功能可以在localizedFallbackTitle中设置成空字符串。其他可以自定义的属性可以在LAContext官方文档的实例方法列表中找到(例如可以允许的最大失败数,默认好像是3;再例如指纹作用延长的时间,也就是一次成功验证之后多长时间内不用再次验证。。搞支付的朋友们还是别动这个属性就好。。;还有其他一些属性,有空研究)

最后简单提一嘴应用场景和业务逻辑,我们是仿支付宝在账户安全中加的一个开关,如果本机不支持指纹识别则隐藏该列,否则可以手动打开和关闭,打开后要验证支付密码,比对成功之后再绑定。密码存在UserDefaults中,建议用用户名作为key。然后每次内部支付前检查是否绑定了指纹支付,通过指纹验证后直接把保存的密码发送给服务器即可。

上一篇下一篇

猜你喜欢

热点阅读