TouchId
iPhoneX的脸部识别一样使用
载入 LocalAuthentication Framework
import LocalAuthentication
建立 Context
在使用 Touch ID 之前,需要先获得一个上下文对象,来管理操作指纹解锁的过程。在整个过程中可能会因为设备条件以及用户操作等原因出现很多异常,我们建立一个 NSError 对象来获取异常。
func touchId() {
let context = LAContext()
context.localizedFallbackTitle = "指纹解锁失败"
var error:NSError?
//判断设备是否支持指纹识别
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
//开始指纹解锁
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "请用指纹解锁", reply: { (success, error) in
if success {
// 成功之后的逻辑, 通常使用多线程来实现跳转逻辑。
DispatchQueue.main.async {
self.statusLabel.text = "解锁成功"
self.view.backgroundColor = greenColor
}
} else {
guard let error = error else {
return
}
// 失败后, 也使用多线程来实现跳转逻辑。
print(error.localizedDescription)
var message:String
if #available(iOS 11.0, *) {
message = self.errorMessageForLAErrorCodeIOS11(errorCode: (error as NSError).code)
} else {
message = self.errorMessageForLAErrorCode(errorCode: (error as NSError).code)
}
print(message)
DispatchQueue.main.async {
self.statusLabel.text = message
self.view.backgroundColor = redColor
}
}
})
} else {
print("指纹解锁不可用")
self.statusLabel.text = "指纹解锁不可用"
self.view.backgroundColor = UIColor.gray
}
}
捕获错误
我们在这里写一个函数来捕获错误原因并且记录错误信息,虽然这不是必须的,但是一个好的交互设计通常会考虑这些:
func errorMessageForLAErrorCode(errorCode: Int) -> String {
var message = ""
switch errorCode {
case LAError.appCancel.rawValue:
message = "Authentication was cancelled by application"
case LAError.authenticationFailed.rawValue:
message = "The user failed to provide valid credentials"
case LAError.invalidContext.rawValue:
message = "The context is invalid"
case LAError.passcodeNotSet.rawValue:
message = "Passcode is not set on the device"
case LAError.systemCancel.rawValue:
message = "Authentication was cancelled by the system"
case LAError.touchIDLockout.rawValue:
message = "Too many failed attempts."
case LAError.touchIDNotAvailable.rawValue:
message = "TouchID is not available on the device"
showPassWordInput()
case LAError.biometryLockout.rawValue:
message = "Too many failed attempts."
case LAError.biometryNotAvailable.rawValue:
message = "TouchID is not available on the device"
showPassWordInput()
case LAError.userCancel.rawValue:
message = "The user did cancel"
case LAError.userFallback.rawValue:
message = "The user chose to use the fallback"
default:
message = "Did not find error code on LAError object"
}
return message
}
//iOS11以上专用
func errorMessageForLAErrorCodeIOS11(errorCode: Int) -> String {
var message = ""
switch errorCode {
case LAError.appCancel.rawValue:
message = "Authentication was cancelled by application"
case LAError.authenticationFailed.rawValue:
message = "The user failed to provide valid credentials"
case LAError.invalidContext.rawValue:
message = "The context is invalid"
case LAError.passcodeNotSet.rawValue:
message = "Passcode is not set on the device"
case LAError.systemCancel.rawValue:
message = "Authentication was cancelled by the system"
case LAError.biometryLockout.rawValue:
message = "Too many failed attempts."
case LAError.biometryNotAvailable.rawValue:
message = "TouchID is not available on the device"
showPassWordInput()
case LAError.userCancel.rawValue:
message = "The user did cancel"
case LAError.userFallback.rawValue:
message = "The user chose to use the fallback"
default:
message = "Did not find error code on LAError object"
}
return message
}