• 基于 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;
              }
          }
      }
      
  • 相关阅读:
    Java NIO开发需要注意的陷阱(转)
    Java Nio注意事项
    NIO的介绍及使用(总结)
    蓝萝卜blu netty3升netty4
    tcp nio 远程主机强迫关闭了一个现有的连接
    java 竖线分割字符串的问题
    15个免费好用的抓包工具
    JSP 基础之 JSTL <c:forEach>用法
    JSP中多条件判断
    怎么不让控制台system.out.println()打印
  • 原文地址:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/5357946.html
Copyright © 2020-2023  润新知