通过LAContext evaluatedPolicyDomainState属性可以获取到当前data类型的指纹信息数据,当指纹增加或者删除,该data就会发生变化,通过记录这个TouchIdData与最新的data做对比就能判断指纹信息是否变更,从而定制app功能。

存在的疑问:
  1. TouchIdData可能为空吗?
    官方文档说明:

    Discussion
    This property returns a value only when the canEvaluatePolicy(:error:) method succeeds for a biometric policy or the evaluatePolicy(:localizedReason:reply:) method is called and a successful biometric authentication is performed. Otherwise, nil is returned.
    只有当canEvaluatePolicy方法执行并返回YES或者evaluatePolicy执行并指纹识别通过,这个属性才能有值,否则为空。

  2. TouchIdData能否获取具体的指纹信息?

    The returned data is an opaque structure. It can be used to compare with other values returned by this property to determine whether the authorized database has been updated. However, the nature of the change cannot be determined from this data.
    返回的数据是一个不透明的结构。它可以用来与此属性返回的其他值进行比较,以确定是否更新了授权数据库。然而,变化的性质不能从这些数据中确定。

  3. 在指纹信息没有修改的时候,不同app获取到的TouchIdData是一样的吗?
    实测不同的app,在指纹没有变化的情况下TouchIdData是不一样的。但这个是不能打包票的,如果苹果修改了这部分的算法,返回一个相同值也是有可能的。

  4. 添加一个新指纹,再删除刚添加的那个指纹,TouchIdData相对一轮操作之前变化了吗?
    实测TouchIdData没有变化,也就是说TouchIdData是面向结果的,而不是面向过程的,只要最终结果指纹集合一样,TouchIdData就一样。

代码实现

    static var IDENTIFY:String? = nilstatic let SERVICE = "TOUCHID_SERVICE"static let ACCOUNT_PREFIX = "TOUCHID_PERFIX"open class func setCurrentTouchIdDataIdentity(identity:String ){//设定当前身份用于存储dataTouchIdManager.IDENTIFY = identity}//获取当前时刻的dataclass func currentOriTouchIdData() -> Data?{let context = LAContext()var error:NSError? = nil;
//先使用canEvaluatePolicy方法进行评估if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {return context.evaluatedPolicyDomainState}print("errorMsg:" + self.errorMessageForFails(errorCode:(error?.code)! ))return nil}//使用keychain保存当前身份的data
open class func setCurrentIdentityTouchIdData()-> Bool{if self.currentTouchIdDataIdentity() == nil{return false;}else{if self.currentOriTouchIdData() != nil{//storage by keychainSAMKeychain.setPasswordData(self.currentOriTouchIdData()!, forService:SERVICE, account: ACCOUNT_PREFIX + self.currentTouchIdDataIdentity()!)return true;}else{return false;}}}//获取当前身份的上一次存储的data,用于对比class func currentIdentityTouchIdData()->Data?{guard (self.currentTouchIdDataIdentity() != nil) else {return nil;}return  SAMKeychain.passwordData(forService: TouchIdManager.SERVICE, account: TouchIdManager.ACCOUNT_PREFIX + self.currentTouchIdDataIdentity()!)}//检测以这个身份设置开始到当前时刻指纹信息是否变更
open class func touchIdInfoDidChange()->Bool{let data = self.currentOriTouchIdData()if data == nil && self.isErrorTouchIDLockout() {//lock after unlock failed many times,and the fingerprint is not changed.return false}else{let oldData = self.currentIdentityTouchIdData()if oldData == nil{//never setreturn false}else if oldData == data{//not changereturn false}else{return true}}}//检测当前是否为biometryLockout状态class func isErrorTouchIDLockout()->Bool{let context = LAContext()var error:NSError?context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error)guard error != nil else {return false}if error!.code == LAError.biometryLockout.rawValue {return true}else{return false}}
指纹识别的两种LAPolicy:
  • deviceOwnerAuthenticationWithBiometrics
    这个类型不能弹出密码解锁界面,但能更精准的反馈用户操作的状态:如指纹识别三次失败等。
  • deviceOwnerAuthentication
    对识别行为的结果做了简化,无法判断具体状态。但能弹出密码解锁界面。
    结合两者可以使指纹解锁做的更友善一点。
  • 最终效果[正常流程]:指纹识别错误三次回调失败->再点击再识别错误两次->弹出密码解锁界面->密码错误5次->锁定1分钟->再输错->锁定五分钟。

代码实现

 open class func showTouchId(title:String,fallbackTitle:String?, fallbackBlock:TouchIdFallBackBlokc?,resultBlock:TouchIdResultBlock?){let context = LAContext();context.localizedFallbackTitle = fallbackTitlevar useableError:NSError?if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &useableError) {context.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason: title) { (success, error) inDispatchQueue.main.async {if success{if resultBlock != nil{resultBlock!(true,success,error)}}else{guard let error = error else{return;}print("errorMsg:" + self.errorMessageForFails(errorCode: error._code))if error._code == LAError.userFallback.rawValue{if fallbackBlock != nil{fallbackBlock!()}}else if error._code == LAError.biometryLockout.rawValue{//try to show password interfaceself.tryShowTouchIdOrPwdInterface(title: title, resultBlock: resultBlock)}else{if resultBlock != nil{resultBlock!(true,success,error)}}}}}}else{print("errorMsg:" + self.errorMessageForFails(errorCode:(useableError?.code)! ))if useableError?.code == LAError.biometryLockout.rawValue{//try to show password interfaceself.tryShowTouchIdOrPwdInterface(title: title, resultBlock: resultBlock)}else{if resultBlock != nil{resultBlock!(false,false,useableError)}}}}class func tryShowTouchIdOrPwdInterface(title:String,resultBlock:TouchIdResultBlock?){let context = LAContext();context.localizedFallbackTitle = ""var useableError:NSError?if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthentication, error: &useableError) {context.evaluatePolicy(LAPolicy.deviceOwnerAuthentication, localizedReason: title) { (success, error) inDispatchQueue.main.async {if resultBlock != nil{resultBlock!(true,success,error)}}guard let error = error else{return;}print("errorMsg:" + self.errorMessageForFails(errorCode: error._code))}}else{print("errorMsg:" + self.errorMessageForFails(errorCode:(useableError?.code)! ))if resultBlock != nil{resultBlock!(false,false,useableError)}}}

测试demo:
swift:https://github.com/zmubai/TouchIDTest-swift
object-c:https://github.com/zmubai/TouchIDTest-OC

iOS 指纹解锁 检测指纹信息变更相关推荐

  1. android指纹解锁_Android指纹锁

    android指纹解锁 In this tutorial, we'll be discussing the Android Fingerprint API and implement a Finger ...

  2. 安卓系统的指纹解锁_安卓手机指纹解锁 手机指纹解锁怎么用 无良小偷的克星 好好玩...

    现在人都比较在乎空间和安全,安全就不用说了,不管什么的安全都特别在意,越安全越好.就拿手机来说,现在的人都离不开的一个物件,哪怕自己不小心把手机遗忘在什么地方,也不希望别人看到自己手机中的任何个人信息 ...

  3. android开发指纹解锁,Android-指纹解锁技术

    什么是指纹解锁技术 指纹解锁技术原理理解 指纹解锁技术的优势和缺点 在Android中的应用开发 什么是指纹解锁技术 根据人的指纹来验证是否能够解锁的技术,类似于通过输入密码来解锁,都是通过一定的数字 ...

  4. h5调用指纹识别_如何玩转指纹解锁H5插件?

    原标题:如何玩转指纹解锁H5插件? 科技发展到今天,生活中很多东西都被附上智能二字,手机.家电.家居.汽车等等很多方面,就连指纹也变得不一般了.指纹解锁最开始仅仅是在打卡签到上使用的,渐渐的人们保险安 ...

  5. android获取指纹信息最新,# android 指纹识别并检测指纹库是否变更

    android API 23时新增的功能,指纹识别 主要类:FingerpringManager 在API28后,FingerpringManager被遗弃,使用BiometricPrompt,此时授 ...

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

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

  7. iOS 关于TouchID指纹解锁的实现

    转载请注明出处!!! 一直想玩玩指纹解锁,近期时间比较闲,就研究了一下这个指纹解锁.这个功能实现起来还是很简单的,虽然看起来比较高大上,但是对于开发来说,越是高大上的东西一般都有封装好的,我们只需要调 ...

  8. 【源码】iOS指纹解锁Touch ID的开发

    指纹解锁原理: 苹果在文件中对iPhone 5S配备的Touch ID指纹识别系统的功能与工作原理进行了详细说明.文件对iPhone 5S的A7处理器中""Secure Encla ...

  9. iOS开发实现TouchID指纹解锁

    iOS开发实现TouchID指纹解锁 一直想实现一下指纹解锁,苦于一直没时间,最近终于闲了下来所以翻了翻文档看了看demo,完成了这篇教程.本功能实现起来是很简单的,因为苹果都已经帮我们封装好了,只需 ...

最新文章

  1. vivo升级android10系统,官方确认vivo NEX旗舰版会直接升级到Android10
  2. C#学习笔记(六):可空类型、匿名方法和迭代器
  3. 出国?上研?工作?回家种田?(一) 出国看世界
  4. 数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型的概念
  5. 安全地创建和存储密码
  6. android 技能标签功能_android专业技能总结.doc
  7. IOT---(8)四大物联网通信技术差异:NB-IoT 、LTEeMTC、LoRa与SigFox
  8. AJPFX总结String类的特点
  9. 区块链 分片技术和闪电网络区别
  10. Zabbix分布式监控系统使用总结
  11. 模拟退huo算法的特点_模拟退火算法(有完整实例源代码)
  12. android坐标画图软件下载,地图坐标app下载-地图坐标软件下载v4.8.15 安卓版-西西软件下载...
  13. 如何制作一寸。二寸。六寸照片 多学点,以后自己也可以弄哦
  14. 小微企业都在用的一体化管理解决方案
  15. 计算机快捷键40个,如何快速记住计算机快捷键
  16. c# 获取照片的经纬度和时间
  17. js创建二维数组小坑
  18. 我的情怀44(女人之美)
  19. Win10激活提示“连接到internet激活windows”的最佳解决方法
  20. 深入浅出:JWT(JSON Web Token)鉴权

热门文章

  1. np.add.at和np.negative.at
  2. jquery UI 跟随学习笔记——拖拽(Draggable)
  3. 一年中的最后一天说说_2018最后一天感言说说 怎么发朋友圈告别2018年
  4. 这是一份普通的cpp答卷,可能有错
  5. Android肝帝战纪之字体图标库(iconify)的简单使用
  6. 制作u盘版的kail linux 系统,即插即用,用于破解邻居妹子家的wifi
  7. Windows PowerShell 使用SDKMAN
  8. 趋势与新高的实战研究
  9. WPS添加页码不是从首页开始
  10. uniapp苹果打包白屏 ,安卓没问题,运行也不报错,自定义基座也没问题