是否有一种方法可以检测用户在使用LAContext().evaluatePolicy(.deviceOwnerAuthentication, localizedReason: somerreason)"后是否拒绝了生物识别(faceID) ?
例如,
- 用户第一次登录时,他们被提示应用程序是否可以使用他们的生物识别信息
- 用户拒绝生物识别,然后提示输入密码
- 用户拒绝密码
显示canEvaluatePolicy返回trueLAContext().canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil)"直到我关闭并重新打开应用程序。
我希望能够提醒用户,他们可以在他们的应用程序设置中打开faceID。
似乎没有办法确定你在问题中描述的情况。
我注意到canEvaluatePolicy
的文档声明:
不要存储这个方法的返回值,因为它可能会随着系统的变化而改变。例如,用户可能会在你调用这个方法后禁用Touch ID。但是,在应用程序进入后台之前,报告的值会保持一致。
然而,在测试中,似乎即使将应用程序放入后台也不会改变canEvaluatePolicy
返回的值。
正如你在问题中所指出的,返回的值在应用程序重新启动之前不会改变。你还会看到,如果你进入偏好并切换应用的生物识别设置你的应用实际上会重新启动。其他与隐私相关的设置也会发生相同的过程。
如果你确定它被拒绝了,你可以在随后的启动中提供生物识别认证,但是当用户已经做出决定时,你应该小心不要打扰他们。
您可以使用的另一种方法是尝试LAContext().evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "reason")
,如果由于生物识别被拒绝而失败,则使用LAContext().evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "reason")
重试身份验证,这将立即提示输入密码。
// Declare You're own Error type to handle possible errors
enum BiometryError: Swift.Error, LocalizedError {
case unavailable, // Biometry unavailable
failed, // Can't verify
cancel, // User pressed cancel
failback, // User choose password
locked, // Biometry is locked
enrolled, // Biometry not setup
succsess // Success
init(error: LAError) {
switch error {
case LAError.authenticationFailed:
self = .failed
case LAError.userCancel:
self = .cancel
case LAError.userFallback:
self = .failback
case LAError.biometryNotAvailable:
self = .unavailable
case LAError.biometryNotEnrolled:
self = .enrolled
case LAError.biometryLockout:
self = .locked
default:
self = .unavailable
}
}
public var errorDescription: String? {
switch self {
case .unavailable:
return "Unavailable"
case .failed:
return "Failed"
case .cancel:
return "Cancel"
case .failback:
return "Failback"
case .locked:
return "Locked"
case .enrolled:
return "Enrolled"
case .succsess:
return "Succsess"
}
}
}
// Authenticate method
func authenticateBiometry(reply callback: @escaping (Bool, BiometryError?) -> Void) {
LAContext().evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "reason") { success, error in
if let error = error as? LAError, !success {
// Here in this callback You can handle error and show alert if You want
callback(false, BiometryError(error: error))
} else {
// Success
callback(true, nil)
}
}
}