Touch ID使用详细分解

由于最近要使用指纹解锁app,就暂且了解了一下,注释非常详细。需要注意的是在successBlock里面代码是后台线程执行的。

如果需要放在主线程,可添加到主线程上执行:

1、点击屏幕,弹出Touch ID框

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // ios8.0以上 iphone5s之后才有touchID功能
    [self authenticateUser];

}

2、实现方法

- (void)authenticateUser
{
    //初始化上下文对象
    LAContext* context = [[LAContext alloc] init];
    
    //localizedFallbackTitle设置为@""代表指纹输错不会出现右侧“输入密码”字样
    context.localizedFallbackTitle = @"";

    //错误对象
    NSError* error = nil;
    NSString* result = @"xxx利用你的Touch ID解锁";
    
    //首先使用canEvaluatePolicy 判断设备是否支持Touch ID的状态
    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 主线程
        //支持指纹验证
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError \*error) {
#warning 后台线程
            if (success) {
                //验证成功,后台线程
                NSLog(@"验证成功");
            }
            else
            {
                switch (error.code) {
                    case LAErrorSystemCancel:
                    {
                        //切换到其他APP,系统取消验证Touch ID 其他app切入
                        NSLog(@"切换到其他APP,系统取消验证Touch ID 其他app切入Authentication was cancelled by the system"); 
                        break;
                    }
                    case LAErrorAppCancel:
                    {
                        NSLog(@"用户不能控制的挂起 比如打电话");
                        break;
                    }
                    case LAErrorUserCancel:
                    {
                        //用户取消验证Touch ID
                        NSLog(@"用户取消验证Touch IDAuthentication was cancelled by the user"); 
                        break;
                    }
                    case LAErrorUserFallback:
                    {
                        NSLog(@"用户选择输入密码,切换主线程处理User selected to enter custom password");
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            //用户选择输入密码,切换主线程处理
                        }];
                        break;
                    }
                    case LAErrorTouchIDLockout:
                    {
                       NSLog(@"多次TouchID失败 Touch ID被锁");// 输入多次不正确 执行代码
                        break;
                    }
                    case LAErrorInvalidContext:
                    {
                        NSLog(@"LAContext对象被释放掉了,造成的授权失败");
                        break;
                    }
                    default:
                    {
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            //其他情况,切换主线程处理
                        }];
                        break;
                    }
                }
                NSLog(@"%@",error.localizedDescription);
            }
        }];
    }
    else{ //不支持指纹识别,LOG出错误详情。比如设备不支持或者指纹没开启(指纹没开启也包括输入错误多次被锁定Touch ID)
         #warning 主线程
        switch (error.code) {
            case LAErrorTouchIDNotEnrolled:
            {
                // 设备Touch ID不可用 用户未录入
                NSLog(@"设备Touch ID不可用 用户未录入TouchID is not enrolled"); 
                break;
            }
            case LAErrorPasscodeNotSet:
            {
                // 系统未设置密码
                NSLog(@"系统未设置密码A passcode has not been set");
                break;
            }
            case LAErrorTouchIDNotAvailable:
            {
                // 设备Touch ID不可用,例如未打开
                NSLog(@"设备Touch ID不可用,例如未打开A passcode has not been set");
                break;
            }
            default:
            {
                // Touch ID被锁定之后,点击屏幕跳到这里
                NSLog(@"TouchID not available");
                break;
            }
        }
        
        NSLog(@"%@",error.localizedDescription);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,839评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,773评论 19 139
  • 引用类型有哪些?非引用类型? 基本类型Number、String、Boolean、Null、Undefined 引...
    白柏更好阅读 1,826评论 0 0
  • 世界好安静,感觉自己无意进入一个滑道。一不小心滑了好远。 身边的人越来越少。偶尔有朋友来串门儿。可是其它所有的时间...
    LOVE玲媛阅读 656评论 0 0
  • 他,一身铠甲,英姿飒爽,却因耿直性情被贬洛阳; 她,一身白衣,温婉动人,只因唯心却被家族唾弃。 还记得那年城郊花开...
    柒沐枫阅读 2,241评论 0 0