Проблема локальной аутентификации - PullRequest
1 голос
/ 08 мая 2019

У меня есть приложение, в котором пользователь может аутентифицироваться либо с 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")
    }
}

1 Ответ

1 голос
/ 08 мая 2019

В вашем коде нет ничего плохого.Я полагаю, что проблема заключается в том, как вы это сделали: «Я отключил эту опцию (в целях тестирования)».

Поскольку вам было предложено всплывающее окно «Touch ID», это доказывает, что ваша биометрия действительно не была отключена.Я предполагаю, что вы переключили один из переключателей «USE TOUCH ID FOR» и подумали, что это отключит биометрические параметры в вашем приложении, чего не произойдет.

Если вы хотите протестировать запасной код на пароль на вашем устройстве:

  • попробуйте удалить все отпечатки пальцев

ИЛИ

  • отключить ваш отпечаток пальца путем многократного ввода незарегистрированных отпечатков пальцев в ваше приложение.
...