iOS-传感器之TouchID

2018-11-08  本文已影响0人  XTK_iOS

仿支付宝TouchID登录方法

支付宝登录流程.gif

1.观看一波完,可以看到支付宝的登录流程:

(1) 当我们连续三次指纹识别错误后,进行提示 指纹不匹配

(2) 再次点击 指纹识别,再两次识别失败后,Touch ID功能被锁定,弹出密码来进行身份验证进行解锁TouchID功能

(3) 当我们 五次 指纹未识别后并且使用密码进行解锁TouchID后,再次弹出TouchID 来进行验证指纹

(4) 当我们进行验证密码登录后 就会切换到 自己支付宝账号的密码进行 登录

以上就是 支付宝整个TouchID的登录流程

2.上代码

- (IBAction)fingerprintButton:(UIButton *)sender {
    //首先判断版本
    if (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) {
        NSLog(@"系统版本不支持TouchID");
        return;
    }else {
        // 验证指纹是否匹配,需要弹出输入密码的弹框的话:
        // iOS9之后用 LAPolicyDeviceOwnerAuthentication可输入手机密码的验证方式
        // iOS9之前用LAPolicyDeviceOwnerAuthenticationWithBiometrics 只有指纹的验证方式
      [self startTouchIDWithPolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics];
    }
}

- (void)startTouchIDWithPolicy:(LAPolicy )policy {
    LAContext *context = [[LAContext alloc]init];
    //设置 输入密码 按钮的标题
    //localizedFallbackTitle=@“”,不会出现“输入密码”按钮
    context.localizedFallbackTitle = @"验证登录密码";
    //设置 取消 按钮的标题 iOS10之后
    if (@available(iOS 10.0, *)) {
        context.localizedCancelTitle = @"取消";
    }else {
        // Fallback on earlier versions
    }
    
    NSError *error;
    _localizedReason = @"通过Home键验证已有手机指纹";
    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {//判断设备是否支持TouchID
        
        [context evaluatePolicy:policy localizedReason:_localizedReason reply:^(BOOL success, NSError * _Nullable error) {
            if (success) {
                NSLog(@"指纹识别成功");
                // 指纹识别成功,回主线程更新UI
                dispatch_async(dispatch_get_main_queue(), ^{
                    if (policy == LAPolicyDeviceOwnerAuthentication) {
                        [self startTouchIDWithPolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics];
                    }else {
                        
                    }
                });
            }else {
                //指纹识别失败,回主线程更新UI
                NSLog(@"指纹识别失败");
                dispatch_async(dispatch_get_main_queue(), ^{
                    //失败操作
                    [self handelWithError:error];
                });
            }
        }];
        
    }else {
        NSLog(@"当前设备不支持TouchID");
    }
}

/**
 处理错误数据
 @param error 错误信息
 */
- (void)handelWithError:(NSError *)error {
    if (error) {
/**
-1 LAErrorAuthenticationFailed,    // 验证信息出错,就是说你指纹不对
-2 LAErrorUserCancel               // 用户取消了验证
-3 LAErrorUserFallback             // 用户点击了手动输入密码的按钮,所以被取消了
-4 LAErrorSystemCancel             // 被系统取消,就是说你现在进入别的应用了,不在刚刚那个页面,所以没法验证
-5 LAErrorPasscodeNotSet           // 用户没有设置TouchID
-6 LAErrorTouchIDNotAvailable      // 用户设备不支持TouchID
-7 LAErrorTouchIDNotEnrolled       // 用户没有设置手指指纹
-8 LAErrorTouchIDLockout           // 用户错误次数太多,现在被锁住了
-9 LAErrorAppCancel                // 在验证中被其他app中断
-10 LAErrorInvalidContext          // 请求验证出错
 */
        NSLog(@"指纹识别错误描述 %@",error.description);
        
        NSString *message;
        LAError errorCode = error.code;
        switch (errorCode) {
            case LAErrorAuthenticationFailed:
                message = @"已经连续三次指纹识别错误了,请输入密码验证";
                _localizedReason = @"指纹验证失败";
                [self createAlterView:message];
                break;
            case LAErrorUserFallback:
                NSLog(@"手动输入密码的按钮,切换其他方式登录");
                message = @"手动输入密码的按钮,切换其他方式登录";
                [self createAlterView:message];
                break;
            case LAErrorTouchIDLockout:
                //touchID 被锁定--ios9才可以
                [self handleLockOutAliPay];
                break;
            default:
                break;
        }
    }
}

/**支付宝处理锁定
 */
- (void)handleLockOutAliPay {
    //开启验证--调用非全指纹 指纹验证
    [self startTouchIDWithPolicy:LAPolicyDeviceOwnerAuthentication];
}

上一篇下一篇

猜你喜欢

热点阅读