iOS之Touch ID的使用

时间:2022-01-26 05:17:56

最近做了一个Touch ID的功能,添加到APP内,所以研究了一下,下面跟大家分享一下。

iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论上第三方软件不可使用。

在开始前,我们首先要做一下,依赖库的添加,这里给大家介绍一种新的方式,比较方便,不用先添加,然后在引用头文件,直接这样就可以了:

@import LocalAuthentication; 这个就Touch ID的依赖库。接下来就是要实现下面两个方法:

 //是否可以用 Touch ID 
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;
//用Touch ID后,返回的结果,是否成功
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError *error))reply;
因为在使用 Touch ID前,我们必须使用 canEvaluatePolicy
验证该机器是否支持,不然会直接崩溃的。然后我们 使用 evaluatePolicy

方法启动传说中的指纹验证。接下来先给大家贴个验证操作的返回code列表:

typedef NS_ENUM(NSInteger, LAError){

//授权失败
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
//用户取消Touch ID授权
LAErrorUserCancel = kLAErrorUserCancel,
//用户选择输入密码
LAErrorUserFallback = kLAErrorUserFallback,
//系统取消授权(例如其他APP切入或者按home键时)
LAErrorSystemCancel = kLAErrorSystemCancel,
//系统未设置密码
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
//设备Touch ID不可用,例如未打开
LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable,
//设备Touch ID不可用,用户未录入
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,

}
其他的就不多说了看代码:

 LAContext *context=[[LAContextalloc] init];

    context.localizedFallbackTitle=@"";

    NSError *err;

    if([contextcanEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationerror:&err]){

        

        NSLog(@"该设备支持Touch ID");

        UIView *view=[[UIViewalloc] initWithFrame:CGRectMake(0,0, [UIScreenmainScreen].bounds.size.width, [UIScreenmainScreen].bounds.size.height)];

        view.backgroundColor=[UIColorblackColor];

        view.alpha=0.5;

        [self.viewaddSubview:view];

        

        [context isCredentialSet:LACredentialTypeApplicationPassword];

        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationlocalizedReason:@"指纹验证"reply:^(BOOL success,NSError * _Nullable error) {

            

            if(success)

            {

                NSLog(@"识别成功");

                

                dispatch_async(dispatch_get_main_queue(), ^{

                   

                    [view removeFromSuperview];

                    

                });

                

            

            }

            else

            {

                if(error.code==kLAErrorUserFallback)

                {

                     NSLog(@"Fallback按钮被点击");

                }

                elseif (error.code==kLAErrorUserCancel)

                {

                

                    NSLog(@"取消按钮被点击");

                }

                elseif (error.code==kLAErrorAppCancel)

                {

                    NSLog(@"home键推出");

                }

                else

                {

                    NSLog(@"指纹识别失败%ld",error.code);

                }

                

                dispatch_async(dispatch_get_main_queue(), ^{

                   

                    [view removeFromSuperview];

                });

            }

            

        }];

    

    }else{

        

        NSLog(@"设备不支持Touch ID");

        UIAlertController *alert = [UIAlertControlleralertControllerWithTitle:@"提示"message:@"设备不支持Touch ID"preferredStyle:UIAlertControllerStyleAlert];

        [selfpresentViewController:alert animated:YEScompletion:nil];

        UIAlertAction *action = [UIAlertActionactionWithTitle:@"确定"style:UIAlertActionStyleCancelhandler:^(UIAlertAction *_Nonnull action) {

            isLock=NO;

        }];

        [alert addAction:action];


        

    }

Demo地址就附在这里了:https://github.com/j521887/TouchID_OC