在iPhone 5s(iOS8)加入Touch ID后,指纹识别的功能在App中逐渐受到青睐,特别是对于本地安全较高的应用(如带支付的App)指纹识别是必备的功能,它既能解决在验证过程中输入密码的繁琐过程,同时指纹识的安全等级更高。那么,要想在自己开发的应用中使用指纹识别,就必须要LocalAuthentication.framework提供的API,下面将详细地介绍如何使用这个框架来实现指纹识别功能。

基础用法
我们先来看下面的例子:

LAContext *context = [[LAContext alloc] init];NSError *error = nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])
{[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"输入指纹进行验证" reply:^(BOOL success, NSError * _Nullable error) {if (success){NSLog(@"验证成功");}else{NSLog(@"验证失败");}}];
}
else
{NSLog(@"识别功能不可用");
}

我们来解读一下上面的代码:
LAContext为贯穿整个识别过程的对象类型。使用识别必须初始化一个LAContext对象

在进行指纹(人脸)识别前,需要判断识别功能是否可用,上面代码中的canEvaluatePolicy: error :方法就是做这样一件事情。当方法返回YES时则可以继续调用识别方法。否则需要根据error的描述来提示用户。该方法的policy参数决定了鉴权的行为方式,该参数取值如下:

取值 说明
LAPolicyDeviceOwnerAuthenticationWithBiometrics 指纹(人脸)识别。验证弹框有两个按钮,第一个是取消按钮,第二个按钮可以自定义标题名称(输入密码)。只有在第一次指纹验证失败后才会出现第二个按钮,这种方式下的第二个按钮功能需要自己定义。前三次指纹验证失败,指纹验证框不再弹出。再次重新进入验证,还有两次验证机会,如果还是验证失败,TOUCH ID 被锁住不再继续弹出指纹验证框。以后的每次验证都将会弹出设备密码输入框直至输入正确的设备密码才能重新使用指纹(人脸)识别
LAPolicyDeviceOwnerAuthentication 指纹(人脸)识别或系统密码验证。如果Touch ID (Face ID)可用,且已经录入指纹(人脸),则优先调用指纹(人脸)验证。其次是调用系统密码验证,如果没有开启设备密码,则不可以使用这种验证方式。指纹(人脸)识别验证失败三次将弹出设备密码输入框,如果不进行密码输入。再次进来还可以有两次机会验证指纹(人脸),如果都失败则Touch ID(Face ID)被锁住,以后每次进来验证都是调用系统的设备密码直至输入正确的设备密码才能重新使用指纹(人脸)识别

该方法可以能返回的错码如下所示:

错误码 说明
LAErrorPasscodeNotSet 没有设置设备密码,无法使用指纹(人脸)识别
LAErrorTouchIDNotAvailable 设备不支持Touch ID/Face ID,iOS 11被标注过时,需要使用LAErrorBiometryNotAvailable代替
LAErrorBiometryNotAvailable 设备不支持Touch ID/Face ID,iOS 11新增,由于新增Face ID,故用来代替LAErrorTouchIDNotAvailable
LAErrorTouchIDNotEnrolled 没有录入指纹/人脸,iOS 11被标注过时,需要使用LAErrorBiometryNotEnrolled代替
LAErrorBiometryNotEnrolled 没有录入指纹/人脸,iOS 11新增,由于新增Face ID,故用来代替LAErrorTouchIDNotEnrolled
LAErrorBiometryLockout 超过重试限制,Touch ID/Face ID被锁定,需要进行设备密码解锁后重新激活

检测可用后,调用evaluatePolicy:localizedReason:reply:方法来进行指纹(人脸)识别。其中policy参数应该与调用canEvaluatePolicy: error :方法时传入的policy一致。而localizedReason则是显示在识别标题下面的一栏描述文本,如图所示:

该方法返回的错误如下所示:

错误码 说明
LAErrorPasscodeNotSet 没有设置设备密码,无法使用指纹(人脸)识别
LAErrorTouchIDNotAvailable 设备不支持Touch ID/Face ID,iOS 11被标注过时,需要使用LAErrorBiometryNotAvailable代替
LAErrorBiometryNotAvailable 设备不支持Touch ID/Face ID,iOS 11新增,由于新增Face ID,故用来代替LAErrorTouchIDNotAvailable
LAErrorTouchIDNotEnrolled 没有录入指纹/人脸,iOS 11被标注过时,需要使用LAErrorBiometryNotEnrolled代替
LAErrorBiometryNotEnrolled 没有录入指纹/人脸,iOS 11新增,由于新增Face ID,故用来代替LAErrorTouchIDNotEnrolled
LAErrorBiometryLockout 超过重试限制,Touch ID/Face ID被锁定,需要进行设备密码解锁后重新激活
LAErrorAuthenticationFailed 验证失败,指的是指纹(人脸)不匹配
LAErrorUserCancel 用户点击了取消按钮
LAErrorUserFallback 用户点击了输入密码按钮
LAErrorSystemCancel 系统强制取消,可能由于其他应用进入前台
LAErrorAppCancel 应用调用了LAContext的invalidate方法
LAErrorNotInteractive 应用尚未启动完成或者已经进入非激活状态时调用验证方法会收到该错误,例如:将验证方法放到didEnterBackground方法中进行可能会导致这个错误。

通过上面的例子和解释,大家对LocalAuthentication这个框架应该有了一定的了解吧,但是作为一种验证方式,上面的做法是不够安全和严谨的。举个例子,如果我知道你的设备密码,然后通过密码登录你的手机,然后我在你的设备上登记了我的指纹,那么按照上面代码的逻辑,我的指纹也是能够验证通过的。因此,这里需要借助iOS 9上LAContext的一个新属性evaluatedPolicyDomainState来解决这个问题
evaluatedPolicyDomainState表示当下Touch ID/Face ID的一个状态,没有其他的含义。当在在设备上添加、删除指纹(人脸)时,这个值就会发生变化。所以,拿到这个值作比对就能够很容易知道是否有发生变化,下面将继续介绍具体的实现方法。

- (IBAction)switchChangedHandler:(id)sender
{if (self.touchIdSwitch.on){//开启指纹LAContext *context = [[LAContext alloc] init];if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]){//进行第一次的验证,成功后记录验证状态[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"输入指纹开启验证" reply:^(BOOL success, NSError * _Nullable error) {if (success){self.policyDomainState = context.evaluatedPolicyDomainState;}else{NSLog(@"验证失败");self.touchIdSwitch.on = NO;}}];}else{NSLog(@"Touch ID/Face ID不可用");self.touchIdSwitch.on = NO;}}else{self.policyDomainState = nil;}
}- (IBAction)validationButtonClickedHandler:(id)sender
{if (self.touchIdSwitch.on){LAContext *context = [[LAContext alloc] init];if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]){//进行第一次的验证,成功后记录验证状态[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"使用指纹识别验证" reply:^(BOOL success, NSError * _Nullable error) {if (success){if ([context.evaluatedPolicyDomainState isEqualToData:self.policyDomainState]){NSLog(@"验证通过!");}else{NSLog(@"指纹发生变化,请进行后续验证步骤");//这里可以弹出App的登录界面让用户重新登录//等待登录完成后再将evaluatedPolicyDomainState保存起用于后续的操作[self doAppAuthentication:^(BOOL success) {if (success){self.policyDomainState = context.evaluatedPolicyDomainState;NSLog(@"验证通过!");}}];}}else{NSLog(@"验证失败");}}];}else{NSLog(@"Touch ID/Face ID不可用");}}
}- (void)doAppAuthentication:(void (^)(BOOL success))handler
{//执行应用自身验证体系,并将验证结果回调if (handler){handler (YES);}
}

1、设置一个开关(UISwitch)
2、当开关开启时,要求用户进行指纹识别,在识别成功后将evaluatedPolicyDomainState保存起来,用于后续指纹验证时对比。
3、 在需要验证的地方,使用指纹识别API进行验证,同时获取evaluatedPolicyDomainState来比对之前保存的值,如果相同则验证成功,否则验证失败,需要进行后续的处理,如需要输入应用账号的密码。
4、 通过App自身验证体系检测通过后在把新的evaluatedPolicyDomainState保存起来,用于往后的验证操作。

Face ID的验证过程实践
Face ID其实就是人脸识别中对人脸的唯一标识。苹果目前在iPhone X设备中应用了这项技术,通过人脸识别来解锁设备。同样如果App内需要使用人脸识别来解锁某些访问,也是使用LAContext来实现,而且实现流程跟Touch ID一样,几乎不需要改写任何代码。唯一需要注意的地方是,iOS 11后LAContext新增一个只读属性biometryType,该属性表示当前设备支持生物识别类型(是Touch ID还是Face ID),其枚举值说明如下:

枚举值 说明
LABiometryTypeNone 表示设备不支持生物识别技术
LABiometryNone 在iOS 11中已经过时,使用LABiometryTypeNone代替
LABiometryTypeTouchID 表示当前设备支持指纹识别
LABiometryTypeFaceID 表示当前设备支持人脸识别

那么,这个值最重要的作用就是让你可以区分到底现在使用的是Touch ID还是Face ID,然后编码时可以根据类型来作不同的提示和判断。例如:

NSString *reason = @"使用指纹识别验证";
if (@available(iOS 11.0, *))
{if (context.biometryType == LABiometryTypeFaceID){reason = @"使用人脸识别验证";}
}[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:reason reply:^(BOOL success, NSError * _Nullable error) {//Do something...}];

注意:使用Face ID功能必须要在Info.plist中加入NSFaceIDUsageDescription并添加准确的使用描述

iOS 指纹、Face ID验证 --- LocalAuthentication相关推荐

  1. iOS-Touch ID验证指纹检测以及识别

    废话不说,直接代码拿走: .h文件 // Copyright © 2017年 rjx. All rights reserved. #import <Foundation/Foundation.h ...

  2. iOS 指纹解锁 验证TouchID

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

  3. iOS传感器开发——为APP添加手机密码、指纹进行安全验证

    iOS传感器开发--为APP添加手机密码.指纹进行安全验证 一.引言 iPhone5s之后,iPhone硬件上已支持进行指纹识别的功能,相应的,一些新的api也可以应用于APP中,进行用户安全的验证. ...

  4. IOS指纹/面容识别,TouchID/FaceID验证

    转自:https://www.jianshu.com/p/da752036b2f4 你还在为开发TouchID/FaceID识别功能而去翻阅大量的文档吗? 使用YZAuthID仅需一个回调方法即可轻松 ...

  5. iOS指纹解锁和手势解锁

    前言 一直想写博客来着,一来可以记录一些自己学习和研究的东西,二来也可以将自己写的一些东西分享出去,给他人参考,还可能收到他人的一些建议,从而完善自己的项目和提升自己的技术,这也是一种很好的技术交流方 ...

  6. Swift实现Touch ID验证

    iOS8开放了很多API,包括HomeKit.HealthKit什么的.我们这里要说的是其中之一的Touch ID验证. 以前用app保护用户的隐私内容,只能设定和输入密码.眼看着只能是iPhone本 ...

  7. iOS 指纹支付和面容支付

    生物信息支付 在 iOS App 开发中,或许你需要验证当前设备主人的指纹或者面容信息,在 iOS 系统中,他们统称为本地生物信息鉴定. 本地生物信息验证,是通过 Apple 提供的一个 LocalA ...

  8. ios与android指纹识别,iOS 指纹登录(TouchID)集成方案

    TouchID指纹识别是iPhone 5S设备中增加的一项重大功能.苹果的后续移动设备也相继添加了指纹功能,在实际使用中还是相当方便的,比如快捷登录,快捷支付等等.系统提供了相应框架,使用起来还是比较 ...

  9. 苹果12系统升级无服务器,iOS 12.1.4验证现已关闭 你还没升到12.2吗?

    原标题:iOS 12.1.4验证现已关闭 你还没升到12.2吗? iOS 12.2 正式版推送后不久,苹果于本周五凌晨关闭 iOS 12.1.4 验证通道,以确保 iPhone.iPad 和 iPod ...

最新文章

  1. MySQL新建数据库和表
  2. 4024-砾石的交换排序(C++,附思路)
  3. wlan bss ess ssid
  4. centos安装python3.5_CentOS 7安装Python3.5
  5. [debug] Expected to have finished reduction in the prior iteration before starting a new one.
  6. python背包问题递归_想问下大神python的背包问题的源代码(最好玩也有伪代码,请用递归法实现),因为只学过递归法,所...
  7. 狂神说Redis笔记三
  8. 怎么用c语言制作游戏,怎么用c语言编写游戏.doc
  9. MATLAB元胞自动机
  10. 【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(四)
  11. 计算机仿真塞曼效应实验报告,实验报告模板
  12. Cadence PSpice 仿真2: 三极管运放交流小信号仿真图文教程
  13. 数位板软件测试工资,一位强迫症患者对板子的深度剖析,绘王H950P数位板测评...
  14. Vue 源码学习过程 - Observer/Dep/Watcher三者实现数据双向绑定
  15. linux 下ssd训练自己的数据
  16. 从拼多多薅羊毛事件来看类似事件的后续处理流程(全程吃瓜汇总)
  17. 《REWORK》读记
  18. 【十三】python面向对象之类和对象
  19. Mars3D开发基础学习:相机Camera及视角控制
  20. 小心做好个人隐私保护!别让笔记本电脑成为隐私泄露的“间谍”

热门文章

  1. 民办大学计算机专业教师,普通本科院校计算机专业教师胜任力模型构建及应用...
  2. python - pandas 之 dataframe - 行列筛选/遍历/新增/删除/连接/合并/修改/跨表update
  3. ShareSDK 各平台配置
  4. html区域框什么意思,如何理解【没有padding 、margin、border的情况下 ,行内框等于内容区域】这句话?...
  5. 细谈渗透测试的前期工作——信息收集
  6. 雨课堂知识点总结(十九)
  7. 计算机二级swot分析,基于SWOT模型的学科竞争力研究
  8. 你知道你的能力有多大么?你是怎样区分自己是将才还是帅才的
  9. Python编程学习3:Python 对象引用和 del 删除引用
  10. 小寒android工具箱,2019年小寒节气介绍:描写小寒的诗词