在App中经常会使用TouchID进行身份验证,那么怎么去实现验证功能的开发呢?接下来一起来看一下它的实现。
LocalAuthentication
首先在项目中需要添加LocalAuthentication.framework,在需要实现的地方import
import LocalAuthentication
LAContext
先来看看LAContext都有什么东西,结果在API中我们发现了两个方法:
// 检查当前设备是否可用touchID,返回一个BOOL值;不会弹验证指纹密码框
open func canEvaluatePolicy(_ policy: LAPolicy, error: NSErrorPointer) -> Bool
// 验证方法,会弹验证指纹密码框
open func evaluatePolicy(_ policy: LAPolicy, localizedReason: String, reply: @escaping (Bool, Error?) -> Swift.Void)
LAPolicy是一个枚举,在API中可以看到有两种类型:
@available(iOS 8.0, *)
case deviceOwnerAuthenticationWithBiometrics //iOS8可用,验证错误三次之后则会被锁定,再验证就会返回不可用状态
@available(iOS 9.0, *)
case deviceOwnerAuthentication //iOS9可用,验证错误三次或者锁定之后会弹出输入密码页面
先来看一下效果图:
再来看看代码的实现
let context = LAContext()
var error: NSError?
context.localizedCancelTitle = "取消"
// iOS 9 之后锁定指纹识别之后,如果需要立即弹出输入密码界面需要使用deviceOwnerAuthentication这个属性重新发起验证
if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
print("TouchID可用")
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "指纹验证解锁") { [weak self](success, error) in
if success {
print("验证成功")
} else {
if let error = error as NSError? {
switch error.code { //LAError的几种错误信息
case LAError.authenticationFailed.rawValue:
print("验证信息出错")
case LAError.userFallback.rawValue:
print("用户选择了另一种方式")
case LAError.userCancel.rawValue:
print("用户取消")
case LAError.systemCancel.rawValue:
print("切换到前台被取消")
case LAError.passcodeNotSet.rawValue:
print("没有设置TouchID")
case LAError.appCancel.rawValue:
print("在验证中被其他app中断")
case LAError.invalidContext.rawValue:
print("验证出错")
default:
print("验证失败")
}
}
}
}
} else {
print("TouchID不可用")
}
- 注意:
1.必须用真机测试下才会有TouchID的功能。
2.指纹识别完成后,需要返回主线程进行相应的操作,否者你会发现有时候识别完4-5秒才能返回结果。
到这里就完成了一个简单的TouchID身份验证的功能,感兴趣的小伙伴可以自己写个demo玩一玩。