.deviceOwnerAuthenticationWithBiometrics: 指纹识别失败后, 点击输入密码,自定义输入密码操作 (例如: 跳转到自定义的视图来让用户输入早先设置的密码)
.deviceOwnerAuthentication: 指纹识别失败后, 点击输入密码, 弹出系统自带的密码输入框(需要输入的是锁屏密码)如下图:⬇️
导入框架
import LocalAuthentication
fileprivate func setupAuthentication() {
// 初始化
let myContext = LAContext()
// 弹窗说明文字
let myLocalizedReasonString = "测试指纹识别"
var authError: NSError? = nil
/**
.deviceOwnerAuthenticationWithBiometrics: 指纹识别失败后, 自定义输入密码操作 (例如: 跳转到自定义的视图来让用户输入早先设置的密码)
.deviceOwnerAuthentication: 指纹识别失败后, 弹出系统自带的密码输入框(需要输入的是锁屏密码)
*/
if myContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) {
myContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: myLocalizedReasonString, reply: { (success, evaluateError) in
if success {
// 指纹识别成功, 进行下一步操作
print("指纹识别成功")
} else {
// 指纹识别失败
if let evaluateError = evaluateError {
print("指纹识别失败 -> \(evaluateError)")
self.infoOf(error: evaluateError as! LAError)
} else {
print("指纹识别失败 -> 未知错误")
}
}
})
} else {
// 指纹识别不可用
if let authError = authError {
print("指纹识别不可用 -> \(authError)")
self.infoOf(error: authError as! LAError)
} else {
print("指纹识别不可用 -> 未知错误")
}
}
}
// 捕获错误原因以及信息
func infoOf(error: LAError) {
switch error.code {
case .authenticationFailed:
print("身份验证多次失败: 因为用户未能提供有效身份证件.")
case .userCancel:
print("身份验证被用户取消: (例如: 点击 [取消] 按钮).")
case .userFallback:
// 输入密码后续操作
// .deviceOwnerAuthenticationWithBiometrics 模式下点击输入密码才会触发此错误
print("身份验证被取消: 因为用户在 \"首次验证失败后\" 的 \"第二次验证中\" 点击了 [输入密码] 按钮.")
case .systemCancel:
print("身份验证被系统取消: (例如: 另一个应用程序准备切换到前台).")
case .passcodeNotSet:
print("身份验证无法启动: 因为没有在设备上设置密码 (只有设置设备的锁屏密码, 才能开启 Touch ID).")
case .touchIDNotAvailable:
print("身份验证无法启动: 因为 Touch ID 不可用 (例如: Touch ID 损坏、设备没有指纹识别硬件模块...).")
case .touchIDNotEnrolled:
print("身份验证无法启动: 因为没有设置指纹.")
case .touchIDLockout:
print("身份验证失败: 因为多次尝试失败, Touch ID 被锁定, 需要通过验证锁屏密码来重新启用 Touch ID.")
case .appCancel:
print("身份验证被 App 取消")
case .invalidContext:
print("LAContext 失效.")
}
}