1

我有一个应用程序,用户可以使用TouchID/ FaceID(如果可用,注册并启用)或密码进行身份验证。所有这些选项都可以在应用程序的设置中设置并存储在UserDefaults. 应用程序加载后,它会检查这些Bool键是否具有真正的价值UserDefaults并采取相应的行动。

当用户拥有带有 TouchID/FaceID 的设备但他们尚未启用和注册它时,我的问题就出现了。在这种情况下,应用程序应仅显示密码屏幕。但相反,TouchID当我禁用该选项(出于测试目的)时,我在我的 iPhone 上呈现。根据Apple的文档,它说:

如果 Touch ID 或 Face ID 可用、已注册且未禁用,则首先会要求用户提供该信息。否则,将要求他们输入设备密码。

在模拟器上,我看到密码屏幕,但在我的 iPhone 上,当它被禁用并返回该键时,我看到TouchID弹出窗口。为什么会这样?我究竟做错了什么?UserDefaultsfalse

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")
    }
}
4

1 回答 1

1

您的代码没有任何问题。我认为问题在于您如何做到这一点“我已禁用该选项(出于测试目的)”。

由于系统提示您弹出“Touch ID”,因此它证明您的生物识别并没有真正被禁用。我推测您切换了“使用触控 ID”开关之一,并认为这样做会禁用您的应用程序中的生物识别功能,但它不会。

如果您想在设备中测试回退到密码:

  • 尝试取消注册所有指纹

或者

  • 通过在您的应用程序上多次输入未注册的指纹来禁用您的指纹。
于 2019-05-08T08:54:23.930 回答