我有一个应用程序,用户可以使用TouchID
/ FaceID
(如果可用,注册并启用)或密码进行身份验证。所有这些选项都可以在应用程序的设置中设置并存储在UserDefaults
. 应用程序加载后,它会检查这些Bool
键是否具有真正的价值UserDefaults
并采取相应的行动。
当用户拥有带有 TouchID/FaceID 的设备但他们尚未启用和注册它时,我的问题就出现了。在这种情况下,应用程序应仅显示密码屏幕。但相反,TouchID
当我禁用该选项(出于测试目的)时,我在我的 iPhone 上呈现。根据Apple的文档,它说:
如果 Touch ID 或 Face ID 可用、已注册且未禁用,则首先会要求用户提供该信息。否则,将要求他们输入设备密码。
在模拟器上,我看到密码屏幕,但在我的 iPhone 上,当它被禁用并返回该键时,我看到TouchID
弹出窗口。为什么会这样?我究竟做错了什么?UserDefaults
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")
}
}