我有一个应用程序,用户可以使用TouchID / FaceID (如果可用、注册和启用)或密码进行身份验证。所有这些选项都可以在应用程序的设置中设置,并存储在UserDefaults中。一旦应用程序加载,它就会检查这些Bool键在UserDefaults中是否有真正的值,并采取相应的行动。
当用户有一个带有TouchID/FaceID的设备,但他们还没有启用并注册它时,我的问题就来了。在这种情况下,应用程序应该只显示密码屏幕。但是,当我禁用了选项(用于测试目的)时,TouchID就会在我的iPhone上显示。根据苹果公司的文件,它说:
如果Touch ID或Face可用、注册,且未禁用,则首先要求用户提供该ID或Face。否则,将要求他们输入设备密码。
在模拟器上,我看到了密码屏幕,但在我的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")
}
}发布于 2019-05-08 08:54:23
你的代码没有什么问题。我相信问题在于你是如何做到这一点的:“我已经禁用了选项(用于测试)”。
因为提示您弹出了"Touch ID“,这就证明了您的生物识别功能并没有被真正禁用。我猜想你会切换其中一个“使用触摸ID”开关,并认为这样做会禁用你的应用程序中的生物识别功能,但它不会。
如果要测试设备中密码的回退:
或
https://stackoverflow.com/questions/56036496
复制相似问题