本地认证问题
LocalAuthentication issue
我有一个应用程序,用户可以在其中使用 TouchID
/ FaceID
(如果可用,注册并启用)或密码进行身份验证。所有这些选项都可以在应用程序的设置中进行设置,并存储在 UserDefaults
中。应用程序加载后,它会检查这些 Bool
键是否在 UserDefaults
中具有真实值并采取相应行动。
我的问题是当用户有一台带有 TouchID/FaceID 的设备但他们没有启用和注册它时。在这种情况下,应用程序应仅显示密码屏幕。但是,当我禁用该选项(出于测试目的)时,TouchID
在我的 iPhone 上显示了我。根据 Apple 的文档,它说:
If Touch ID or Face ID is available, enrolled, and not disabled, the user is asked for that first. Otherwise, they are asked to enter the device passcode.
在模拟器上,我看到密码屏幕,但在我的 iPhone 上,我看到 TouchID
在禁用时弹出,UserDefaults
returns false
代表那把钥匙。为什么会这样?我做错了什么?
override func viewDidLoad() {
super.viewDidLoad()
setUI()
}
func setUI() {
let faceTouchIdState = UserDefaults.standard.bool(forKey: DefaultsKeys.faceTouchIdState)
let passcodeState = UserDefaults.standard.bool(forKey: DefaultsKeys.passcodeState)
if faceTouchIdState {
print("Authenticate")
authenticate()
}
else {
print("Passscode")
showEnterPasscode()
}
}
func showEnterPasscode() {
let context = LAContext()
var errMess: NSError?
let policy = LAPolicy.deviceOwnerAuthentication
if context.canEvaluatePolicy(policy, error: &errMess) {
context.evaluatePolicy(policy, localizedReason: "Please authenticate to unlock the app.") { [unowned self] (success, err) in
DispatchQueue.main.async {
if success && err == nil {
self.performSegue(withIdentifier: "GoToTabbar", sender: nil)
}
else {
print(err?.localizedDescription)
}
}
}
}
else {
print("cannot evaluate")
}
}
您的代码没有任何问题。我认为问题在于您是如何做到的 "I have disabled the option (for testing purposes)"。
由于 "Touch ID" 弹出窗口提示您,这证明您的生物识别并未真正被禁用。我推测您切换了 "USE TOUCH ID FOR" 开关之一,并认为这样做会在您的应用程序中禁用生物识别,但它不会。
如果您想在您的设备中测试密码回退:
- 尝试取消注册所有指纹
或
- 通过输入未注册的指纹来禁用您的指纹
您的应用多次。
我有一个应用程序,用户可以在其中使用 TouchID
/ FaceID
(如果可用,注册并启用)或密码进行身份验证。所有这些选项都可以在应用程序的设置中进行设置,并存储在 UserDefaults
中。应用程序加载后,它会检查这些 Bool
键是否在 UserDefaults
中具有真实值并采取相应行动。
我的问题是当用户有一台带有 TouchID/FaceID 的设备但他们没有启用和注册它时。在这种情况下,应用程序应仅显示密码屏幕。但是,当我禁用该选项(出于测试目的)时,TouchID
在我的 iPhone 上显示了我。根据 Apple 的文档,它说:
If Touch ID or Face ID is available, enrolled, and not disabled, the user is asked for that first. Otherwise, they are asked to enter the device passcode.
在模拟器上,我看到密码屏幕,但在我的 iPhone 上,我看到 TouchID
在禁用时弹出,UserDefaults
returns false
代表那把钥匙。为什么会这样?我做错了什么?
override func viewDidLoad() {
super.viewDidLoad()
setUI()
}
func setUI() {
let faceTouchIdState = UserDefaults.standard.bool(forKey: DefaultsKeys.faceTouchIdState)
let passcodeState = UserDefaults.standard.bool(forKey: DefaultsKeys.passcodeState)
if faceTouchIdState {
print("Authenticate")
authenticate()
}
else {
print("Passscode")
showEnterPasscode()
}
}
func showEnterPasscode() {
let context = LAContext()
var errMess: NSError?
let policy = LAPolicy.deviceOwnerAuthentication
if context.canEvaluatePolicy(policy, error: &errMess) {
context.evaluatePolicy(policy, localizedReason: "Please authenticate to unlock the app.") { [unowned self] (success, err) in
DispatchQueue.main.async {
if success && err == nil {
self.performSegue(withIdentifier: "GoToTabbar", sender: nil)
}
else {
print(err?.localizedDescription)
}
}
}
}
else {
print("cannot evaluate")
}
}
您的代码没有任何问题。我认为问题在于您是如何做到的 "I have disabled the option (for testing purposes)"。
由于 "Touch ID" 弹出窗口提示您,这证明您的生物识别并未真正被禁用。我推测您切换了 "USE TOUCH ID FOR" 开关之一,并认为这样做会在您的应用程序中禁用生物识别,但它不会。
如果您想在您的设备中测试密码回退:
- 尝试取消注册所有指纹
或
- 通过输入未注册的指纹来禁用您的指纹 您的应用多次。