最近APP中需要加指纹解锁的功能,就是类似支付宝的指纹解锁,具体可以到支付宝操作一下,在此就不贴图了。
首先,如果之前没做过指纹识别解锁的同学可以先看一下这篇文章,文章写得挺全面的: 点击打开链接
直接贴代码了,以下是单独封装的一个指纹识别的工具类,可以在使用时直接调用(iOS9及以上系统):
//
// FingerprintManager.swift
// JiuLiFunds
//
// Created by yangyunfei on 2018/1/23.
// Copyright © 2018年 JiuLiFunds. All rights reserved.
//
//指纹解锁
import UIKit
import LocalAuthentication
class FingerprintManager: NSObject {
enum XWCheckResult: NSInteger {
case success //成功
case failed //失败
case passwordNotSet //未设置手机密码
case touchidNotSet //未设置指纹
case touchidNotAvailable //不支持指纹
case cancleSys //系统取消
case canclePer //用户取消
case inputNUm //输入密码
case touchIDLockout //输入次数过多验证被锁
}
static func userFingerprintTipStr(withtips tips:String, withIsPwdBtn:Bool , block : @escaping (_ result :XWCheckResult) -> Void){
if #available(iOS 9.0, *) { //iOS 版本判断 低版本无需调用
let context = LAContext()//创建一个上下文对象
if !withIsPwdBtn {
context.localizedFallbackTitle = "" //设置为空,再试一次的alertVC中没有右边的输入密码按钮
}else {
context.localizedFallbackTitle = "验证手势密码"
}
var error: NSError? = nil//捕获异常
if(context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error)){//判断当前设备是否支持指纹解锁
//指纹解锁开始
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason:tips, reply: { (success, error) in
if(success){
if context.evaluatedPolicyDomainState != nil {
//指纹验证成功
print("指纹验证成功")
block(XWCheckResult.success)
}else{
print("系统密码输入成功")
}
}else{
let laerror = error as! LAError
switch laerror.code {
case LAError.authenticationFailed:
print("连续三次输入错误,身份验证失败。")
block(XWCheckResult.failed)
break
case LAError.userCancel:
print("用户点击取消按钮。")
block(XWCheckResult.canclePer)
break
case LAError.userFallback:
print("用户点击输入密码。")
block(XWCheckResult.inputNUm)
break
case LAError.systemCancel:
print("系统取消")
block(XWCheckResult.cancleSys)
break
case LAError.passcodeNotSet:
print("用户未设置密码")
block(XWCheckResult.passwordNotSet)
break
case LAError.touchIDNotAvailable:
print("touchID不可用")
block(XWCheckResult.touchidNotAvailable)
break
case LAError.touchIDNotEnrolled:
print("touchID未设置指纹")
block(XWCheckResult.touchidNotSet)
break
case LAError.touchIDLockout:
print("touchID输入次数过多验证被锁")
block(XWCheckResult.touchIDLockout)
FingerprintManager.unlockTouchID()
break
default: break
}
}
})
}else{
print("不支持或者验证次数过多已被锁定");
FingerprintManager.unlockTouchID()
}
}
}
/// 检查手机 TouchID 功能是否开启或可以使用
var isSupportTouchID: Bool {
get {
let context = LAContext()
var error :NSError?
let isSupport = context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error)
//自定义的
if #available(iOS 9.0, *) {
return isSupport
}else {//ios9以下
return false
}
}
}
//解锁次数过多被锁之后,调用系统的开机解锁密码
static func unlockTouchID() {
let context = LAContext();
var authError: NSError? = nil;
if #available(iOS 9.0, *) {
if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) {
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "需要您的密码,才能启用 Touch ID", reply: { (success, evaluateError) in
if success {
// Touch ID 解锁成功
}
})
}
} else {
//
}
}
}
调用:
FingerprintManager.userFingerprintTipStr(withtips: "通过验证手机已有指纹解锁",withIsPwdBtn:false , block: { (result:FingerprintManager.XWCheckResult) in
switch result{
case .success:
print("用户解锁成功")
//进行操作,回到主线程,否则可能会有延时
break
case .failed:
print("连续三次输入错误,身份验证失败。")
DispatchQueue.main.async(execute: {
CustomProgressHUD.showTip(onHUD: "指纹解锁失败")
})
break
case .passwordNotSet:
print("未设置密码")
break
case .touchidNotSet:
print("未设置指纹")
break
case .touchidNotAvailable:
print("系统不支持")
break
case .touchIDLockout:
print("touchID输入次数过多验证被锁")
break
default:
break
}
})
注意:iOS9之后指纹输入次数过多之后,需要自己写代码调用系统的开机解锁密码(可以调用工具类中unlockTouchID方法)。