效果

想必大家对 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;
    }
    }
    }

基于 LocalAuthentication 框架的指纹解锁的更多相关文章

  1. iOS 指纹解锁 验证TouchID

    iOS指纹解锁 1.首先,引入依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthenticatio ...

  2. TouchID 指纹解锁

    概述 TouchID 指纹解锁 详细 代码下载:http://www.demodashi.com/demo/10701.html 一.软硬件支持 指纹验证功能的最低硬件支持为iPhone5s, iPa ...

  3. iOS 指纹解锁

    目前常用的App支持指纹解锁的还不是很多,如果在你的项目中用一下是不是显得高大上呢? 废话不说多,干货- 1.在工程中添加LocalAuthentication.framework 2.在需要验证的c ...

  4. iOS9 集成指纹解锁

    添加依赖库 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthentication.h> // 头文件 ...

  5. iOS --- Touch ID指纹解锁

    https://www.cnblogs.com/ljmaque/p/TouchID.html 最近在项目中刚好用到了TouchId指纹解锁功能,之前也没有接触过,立马百度看看究竟是要如何使用,发现其实 ...

  6. SZhe_Scan碎遮:一款基于Flask框架的web漏洞扫描神器

    SZhe_Scan碎遮:一款基于Flask框架的web漏洞扫描神器 天幕如遮,唯我一刀可碎千里华盖,纵横四海而无阻,是谓碎遮 --取自<有匪> 写在前面 这段时间很多时间都在忙着编写该项目 ...

  7. 基于Dubbo框架构建分布式服务(一)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  8. 基于SSH框架的学生公寓管理系统的质量属性

    系统名称:学生公寓管理系统 首先介绍一下学生公寓管理系统,在学生公寓管理方面,针对学生有关住宿信息问题进行管理,学生公寓管理系统主要包含了1)学生信息记录:包括学号.姓名.性别.院系.班级:2)住宿信 ...

  9. 基于BootStrap框架构建快速响应的GPS部标监控平台

    最近一个客户要求将gps部标平台移植到bootStrap框架作为前端框架,符合交通部796部标只是他们的一个基本要求,重点是要和他们的冷链云物流平台进行适配.我自己先浏览了客户的云物流平台的界面,采用 ...

随机推荐

  1. [译]学习IPython进行交互式计算和数据可视化(一)

    --学习IPython进行交互式Python编程.高性能数字计算和数据可视化 作者:Cyrille Rossant 译者:Tacey Wong 注:仅为个人翻译及学习,多有谬处,E文尚可的推荐阅读英文 ...

  2. iOS——使用StroryBoard页面跳转及传值

    之前在网上搜iOS的页面跳转大多都是按回以前的那种xib的形式,但鄙人是使用storyboard的.这篇就只介绍利用storyboard进行页面跳转与传值. 新建页面 iOS的程序也是使用了MVC的思 ...

  3. javascript定时器,取消定时器,及js定时器优化方法

    通常用的方法: 启动定时器: window.setInterval(Method,Time) Method是定时调用的js方法 Time是间隔时间,单位是毫秒 取消定时器: clearInterval ...

  4. 检索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))

    Resvr32 .net中引用控件的名称 如果注册成功,问题不在出现 但是如果是在x64位的系统中,即使控件注册成功,错误依照提示,是因为大多数第三方写的COM控件,只支持32位的系统, 在VS中找到 ...

  5. .net IO异步和Producer/Consumer队列实现一分钟n次http请求

    简介 最近工作中有一个需求:要求发送http请求到某站点获取相应的数据,但对方网站限制了请求的次数:一分钟最多200次请求. 搜索之后,在stackoverflow网站查到一个类似的问题..但里面用到 ...

  6. MySQL中select * for update锁表的范围

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  7. 【Java每日一题】20161122

    package Nov2016; import java.util.ArrayList; import java.util.Iterator; public class Ques1122 { publ ...

  8. c++错误代码1

    今天敲c++,出现一个错误,这个题目错误代码如下: 并没有提示有错误而终止. 运行结果却错了: 很明显,错误的地方是变量r没有初始化. 这让我知道了,这种情况下的某些变量未经初始化而使用编译器是不会报 ...

  9. Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况

      运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...

  10. postgreSQL的设置自增主键初始值

    select setval('t_custom_model_id_seq',1,false);