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