基于 LocalAuthentication 框架的指纹解锁

效果

想必大家对 iPhone 的指纹解锁功能已经相当的熟悉了。来看看效果吧!

Local Authentication

  • 概述

    • Local Authentication 框架提供了按照指定的安全策略请求用户授权(本地授权)的工具。例如, 通过 Touch ID 请求用户授权。
  • LAContext

    • LAContext 提供了用户授权的上下文。在该上下文中,你可以获取用户授权的相关信息。通常会基于用户的授权状态来进行相应的操作。
  • 授权策略

    • 如图

      上图为官方文档的截图,下图是 Xcode 的 library 中的截图(他们是有出入的哦)

    • LAPolicyDeviceOwnerAuthenticationWithBiometrics

      • 可以简单的理解为,基于 TouchID 的授权;若 Touch ID 不可用,将会授权失败。在后面我们会详细阐述这种授权方式
      • Touch ID,将在错误输入 5 次后被锁定。锁定后,需要输入密码来解锁
    • LAPolicyDeviceOwnerAuthentication

      • 支持两种授权方式,即:Touch ID 和 输入密码
      • 优先以 Touch ID 方式进行授权,若 Touch ID 和 输入密码都不用,将授权失败
      • 输入密码授权,将在错误输入 6 次后被锁定
  • 请求用户授权

    • 逻辑

    • 步骤

      1. 创建授权上下文

      2. 初始化授权相关信息

      3. 判断是否支持指定的授权策略

        - (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * _Nullable *)error
        

        注意:若授权上下文为空(即:context = nil), 此时进行判断,会失败,且 error.code 为 0(初始值)

      4. 若支持,则执行下一步;否则,授权失败,根据授权失败信息执行相关操作,错误类型如下

        • 该设备不支持 Touch ID
        • 未设置密码
        • 未注册 Touch ID
      5. 按照指定的策略请求用户授权

        - (void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString *)localizedReason reply:(void (^)(BOOL success, NSError *error))reply
        

        注意:请不要再 Block reply 中在此判断是否支持指定的策略,及调用 - canEvaluatePolicy:error:;否则会死循环

      6. 根据用户授权状态进行下一步操作

        • 用户取消了授权
        • 用户点击了“输入密码”按钮
        • 您已授权失败3次
        • 指纹被锁定
        • 应用程序进入后台
  • LAPolicy

    • LAPolicyDeviceOwnerAuthenticationWithBiometrics,Touch ID 验证
    • LAPolicyDeviceOwnerAuthentication,密码验证(iOS 9.0)
  • LAError(失败信息)

    • 授权策略是否可用
      • LAErrorPasscodeNotSet,没有设置密码
      • LAErrorTouchIDNotEnrolled,没有注册 Touch ID
      • kLAErrorTouchIDNotAvailable,该设备不支持 Touch ID
    • 授权失败
      • LAErrorUserCancel,用户取消授权
      • LAErrorUserFallback,Touch ID 授权失败的情况下,用户点击“输入密码”按钮
      • LAErrorAuthenticationFailed,授权失败三次
      • LAErrorTouchIDLockout(iOS 9.0),Touch ID 被锁定(失败五次)
      • LAErrorSystemCancel,应用进入后台时,授权失败
    • 其他
      • LAErrorAppCancel(iOS 9.0)
      • LAErrorInvalidContext(iOS 9.0)

Touch ID Authentication

  • 使用 Touch ID 进行用户授权

    - (IBAction)authenticationButtonClick:(UIButton *)sender {
        // 1.创建授权上下文
        LAContext *context = [[LAContext alloc] init];
        // 2.初始化授权相关的信息
        NSError *authError = nil;
        NSString *localizedReasoningString = @"error";
        bool isAvailable = false;
        isAvailable = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError];
        // 3.判断是否支持指定的授权策略
        if (isAvailable) {
            // 5.按照指定策略请求用户授权
            [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:localizedReasoningString reply:^(BOOL success, NSError * _Nullable error) {
                if (success) {
                    NSLog(@"success");
                } else {
                    // 6.根据用户授权状态进行下一步操作
                    switch (error.code) {
                        case LAErrorUserCancel:
                            NSLog(@"用户取消了授权 - %@", error.localizedDescription);
                            break;
                        case LAErrorUserFallback:
                            NSLog(@"用户点击了“输入密码”按钮 - %@", error.localizedDescription);
                            break;
                        case LAErrorAuthenticationFailed:
                            NSLog(@"您已授权失败3次 - %@", error.localizedDescription);
                            break;
                        case LAErrorTouchIDLockout:
                            NSLog(@"指纹被锁定 - %@", error.localizedDescription);
                            break;
                        case LAErrorSystemCancel:
                            NSLog(@"应用程序进入后台 - %@", error.localizedDescription);
                            break;
                        default:
                            NSLog(@"++%@--%zd", error.localizedDescription, error.code);
                            break;
                    }
                }
            }];
        } else {
            // 4.根据授权失败信息执行相关操作
            switch (authError.code) {
                case LAErrorPasscodeNotSet:
                    NSLog(@"未设置密码 - %@", authError.localizedDescription);
                    break;
                case LAErrorTouchIDNotEnrolled:
                    NSLog(@"未注册 Touch ID - %@", authError.localizedDescription);
                    break;
                case kLAErrorTouchIDNotAvailable:
                    NSLog(@"该设备不支持 Touch ID - %@", authError.localizedDescription);
                    break;
                default:
                    NSLog(@"--%@--%zd", authError.localizedDescription, authError.code);
                    break;
            }
        }
    }
    
posted @ 2016-04-06 09:35  世俗孤岛  阅读(1353)  评论(3编辑  收藏  举报