Отмена TouchID должна закрыть контроллер представления

Для моего приложения мне нужно сохранить одну страницу с TouchID. Таким образом, пользователь как бы вынужден использовать TouchID или, если устройство его не поддерживает, пароль. Если пользователь отменит аутентификацию TouchID, я хочу, чтобы View исчез и вернулся к корневому представлению. У меня это уже работало, но почему-то больше не работает, и я действительно не знаю, почему?! Я просто скопировал пока не отмененный вариант, остальное не имеет значения, я думаю.

func authenticateUser() {

    let context = LAContext()
    var error: NSError?
    let reasonString = "Authentication is needed to access your App"

    if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error){

        context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString, reply: { (success, policyError) -> Void in
            if success {
                print("authentification successful")


                }

            }else{

                switch policyError!.code{
                case LAError.SystemCancel.rawValue:
                    print("Authentification was canceled by the system")
                case LAError.UserCancel.rawValue:
                    print("Authentication was canceled by user")
                    self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
                //Yes I also tried popToRootViewController, still doesn't work    
}

person beginner_T    schedule 23.02.2016    source источник
comment
попробуй popviewControlleranimated: true   -  person iAnurag    schedule 23.02.2016
comment
извините, я забыл упомянуть, я уже пробовал это тоже ... это также просто делает аутентификацию TouchID исчезающей, но не закрывает представление, поэтому пользователь может видеть представление, которое он не должен видеть без аутентификации. .   -  person beginner_T    schedule 23.02.2016


Ответы (1)


В документации для вызова AssessmentPolicy говорится:

«Блок ответа, который выполняется после завершения оценки политики. Этот блок оценивается в частной очереди, внутренней для платформы, в неопределенном контексте потоков».

Итак, проблема в том, что вы пытаетесь вызвать навигацию не из того потока. Вам нужно сделать этот вызов в потоке пользовательского интерфейса. Например:

dispatch_async(dispatch_get_main_queue()) {
     // Navigation goes here
}
person Keith Coughtrey    schedule 23.02.2016
comment
Можете ли вы рассказать/показать мне, как это сделать? И я немного удивлен, потому что, как я уже сказал, раньше это работало, но после разработки приложения оно по какой-то причине больше не работает, хотя я не изменил ни одной строки кода внутри этого файла. - person beginner_T; 24.02.2016
comment
Выполнение вызовов, которые обновляют пользовательский интерфейс из потока, отличного от пользовательского интерфейса, приводит к непредсказуемым результатам, что объясняет, как поведение может измениться без изменения кода. - person Keith Coughtrey; 24.02.2016
comment
Большое спасибо, теперь все работает идеально! Я думаю, что понимаю, что вы имеете в виду, но до сих пор не совсем понимаю, почему это работало отлично 3 недели назад (каждый раз, когда я проверял это, примерно 20 раз), а теперь каждый раз не работает: D Если я правильно понял ваш ответ. , это должно быть случайно?! Ну не важно, вы исправили, большое спасибо!! - person beginner_T; 24.02.2016