Swift面容指纹识别LAManager

FaceID

前言

指纹识别(TouchID),面容识别(FaceID)在iPhone中是频繁使用的,随时随地都在关闭手机,解锁手机。很多应用为了提高安全和便捷性也会提供相应的保护功能,尤其是涉及到金钱方面的应用,如各银行App、支付宝等。2017年做了一个应用,涉及到对应的功能,需要在退回到Home页面后再进入时弹出保护屏,支持指纹/面容解锁、手势解锁。当时在github上找一个比较方便的三方库,但是始终没有找到合适的,虽说功能不复杂,于是自己简单写了一版。

iOS中使用LocalAuthentication实现指纹识别/面容识别,为了方便,在下文中使用LA代替,LA也是此次更新代码的主要命名。由之前的TouchIDManager改为LAManager,避免过于片面。由于2018年随意取的名字且发布到了pods,此次更新并没有更新工程目录名(认为TouchIDManager)和pod名(为KJTouchIdManager)。

LA流程

已面容识别为例,指纹识别在失败尝试次数上要少一些,但整体流程是一致的

认证流程参考的是支付宝登录流程,大致流程如下(需在支付宝设置中开启LA登录):

  1. 登录时弹出面容识别认证框,如果识别成功,则直接进去支付宝首页
  2. 第一次认证失败,弹出未能识别,提示再次尝试。面容解锁点击再次尝试你面容ID进行识别
  3. 第二次认证失败,弹出提示框,可选重新登录支付宝和取消
  4. 点击取消,可再次点击锁屏页中的面容ID解锁唤起面容解锁
  5. 此时会重复依次走1,2,3,4步骤,也是还有两次认证的机会
  6. 如果点击取消后再次唤起面容识别,还是失败的话,会提示无法使用面容ID,此时已到达最大的尝试次数(5次)
  7. 再次点击取消后再唤起面容识别,此时会唤起系统密码认证框,输入密码成功解锁后,则可以再次使用面容解锁,相当于重置,恢复最大尝试次数5次
  8. 如果期间任何一次弹出重新登录按钮,点击重新登录按钮,则进行支付宝的其他登录方式,如刷脸登录、手机、邮箱登录等

效果图

FaceID.gif
TouchID.gif

关键点与鉴权方式选择

想要达到和支付宝一致的认证流程,首先需要知道LA的认证方式LAPolicy

指纹识别是从iOS8开始在iPhone5S系列上投入使用的,而面容识别是从iOS11开始在iPhoneX系列上使用的。LAPolicy分为deviceOwnerAuthenticationWithBiometricsdeviceOwnerAuthentication两种认证方式,他们的大致区别如下:

deviceOwnerAuthenticationWithBiometrics,生物识别(iOS 8+),错误最大次数(5次)后TouchID/FaceID会被锁住,期间会弹三次框,点取消后可重新进行解锁尝试,锁住后需要到设置里面去解锁才能重新认证。

deviceOwnerAuthentication,生物识别+密码认证(iOS 9+),指纹识别失败三次后会弹出系统密码验证,不输入密码点取消还有两次指纹识别,如果都失败TouchID被锁住,接下来都是通过系统密码进行验证;面容识别失败五次后会被锁住,之后的每次调用都会弹出系统密码进行验证。

鉴权方式选择:使用生物识别deviceOwnerAuthenticationWithBiometrics进行认证,当达到最大错误次数被锁定后,通过在错误回调中使用生物识别+密码认证deviceOwnerAuthentication的方式立马唤起系统密码进行解锁重置

核心代码:

/// 认证流程统一使用生物识别deviceOwnerAuthenticationWithBiometrics
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: localizedReason, reply: { (success, evaluateError) in
      DispatchQueue.main.async {
          if success {
              self.resultDelegate?.handleLAResult(result: .success)
          } else {
              if let error = evaluateError as NSError? {
                  self.LAErrorHandle(errorCode: error.code, context: context)
              }
          }
      }
  })

只使用deviceOwnerAuthentication唤起系统密码框,达到解锁的目的

// 面容识别错误达到一定次数被锁定;换用deviceOwnerAuthentication「生物识别+密码认证」可立马触发系统密码框解锁【关键处理】
if errorCode == LAError.biometryLockout.rawValue { // 或者touchIDLockout (iOS9)
    context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: localizedReason, reply: { (success, error) in

    })
}

LAManager使用

cocoapods

add KJTouchIdManager to your Podfile 在Podfile中加入(pod名称和实际代码类名称不符,是一开始没有想好如何命名,见谅[Lol])

pod 'KJTouchIdManager'

run pod install 运行安装命令:

pod install

手动导入

Drop TouchIdManager fold to your project 将TouchIdManager文件夹拖到你的工程目录(文件夹名称和实际代码类名称不符,是一开始没有想好如何命名,见谅[Lol])

代码

  1. declare an instance 声明一个实例
var laManager = LAManager()
  1. do some config 进行配置,设置认证结果代理,弹框标题等
// 设置代理,处理认证结果回调
laManager.resultDelegate = self
// 解锁失败后用户操作按钮的文字,默认为”输入密码“
laManager.localizedFallbackTitle = "使用密码登录应用"
// 解锁失败后的提示文字
laManager.localizedReason = "面容ID短时间内失败多次,您可以再次尝试或使用密码登录"
  1. implement protocol LAHandleable, handle result 实现认证结果代理,处理成功或失败操作
/// 遵循认证结果协议代理
/// 结果枚举详见LAResult
extension LockViewController: LAHandleable {
    
    func handleLAResult(result: LAResult) {
        switch result {
        case .success:
            dismiss(animated: true, completion: nil)
        case .userFallback:
            print("跳转到登录页,使用密码登录")
        case .biometryNotEnrolled
            print("您没有设置面容ID")
        case ...
        default: ()
        }
    }
}
  1. optional method 可选(判断TouchID/FaceID是否可用)
// 判断指纹/面容是否可用,如果不可用可直接跳过认证逻辑或者不显示相关认证按钮等信息
let isAvaliable = laManager.isAvaliable()

GitHub地址

具体使用可参考github源码和demo,传送门

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,271评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,533评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,580评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,203评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,204评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,664评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,014评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,991评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,536评论 1 326
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,558评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,678评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,267评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,997评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,429评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,580评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,259评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,744评论 2 366

推荐阅读更多精彩内容