App内部需要验证系统的锁屏密码或者指纹和面容ID
1、首先导入本地验证库(LocalAuthentication)
import LocalAuthentication
2、验证是否设备是否支持指纹或FaceID
context.canEvaluatePolicy(.deviceOwnerAuthentication, error: nil)
3、若支持,则开始申请验证
若验证成功,则处理成功逻辑。
验证失败,看失败的原因,进行相应处理。
var error: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
let reason = "Log in to your account"
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason ) { success, error in
if success {
// Move to the main thread because a state update triggers UI changes.
DispatchQueue.main.async { [unowned self] in
self.state = .loggedin
}
} else {
print(error?.localizedDescription ?? "Failed to authenticate")
// Fall back to a asking for username and password.
// ...
}
}
} else {
print(error?.localizedDescription ?? "Can't evaluate policy")
// Fall back to a asking for username and password.
// ...
}
4、验证失败的原因(这个一般基本上都不会出现,所以直接都当错误处理了)
这是我自己写的错误部分,demo上并未体现。
func authFail(err: Error?) {
if let c = err as NSError?{
let cc = LocalAuthentication.LAError.Code.init(rawValue: c.code)
switch(cc) {
case LocalAuthentication.LAError.systemCancel:
print("系统取消授权,如其他APP切入");
break;
case LocalAuthentication.LAError.userCancel:
print("用户取消验证Touch ID");
break;
case LocalAuthentication.LAError.authenticationFailed:
print("授权失败");
break;
case LocalAuthentication.LAError.passcodeNotSet:
print("系统未设置密码");
break;
case LocalAuthentication.LAError.biometryNotAvailable:
print("设备Touch ID不可用,例如未打开");
break;
case LocalAuthentication.LAError.biometryNotEnrolled:
print("设备Touch ID不可用,用户未录入");
break;
case LocalAuthentication.LAError.userFallback:
print("用户选择输入密码,切换主线程处理");
break;
default:
print("其他情况,切换主线程处理");
break;
}
}
}