2016-02-23 6 views
0

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

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  
} 
+0

Ьгу 'popviewControlleranimated: true' – iAnurag

+0

извините, я забыл упомянуть, я уже пробовал это тоже ... что и просто делает проверку подлинности TouchID исчезает, но не отвергает мнение, поэтому пользователь получает вид, который он не должен видеть без проверки подлинности ... –

ответ

1

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

«Ответ блока, который выполняется, когда заканчивается оценка политики Этого блок оценивается на частную очередь внутренней к каркасу в неустановленном контексте нарезания резьбы..»

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

dispatch_async(dispatch_get_main_queue()) { 
    // Navigation goes here 
} 
+0

Можете ли вы рассказать/показать мне, как это сделать? И я удивлен, потому что, как я уже сказал, он работал, но после разработки приложения по какой-то причине он больше не работает, хотя я не изменил ни одной строки кода внутри этого файла. –

+0

Выполнение вызовов, которые обновляют пользовательский интерфейс из потока, отличного от UI, приводит к непредсказуемым результатам, что объясняет, как поведение может меняться без изменения кода. –

+0

Большое спасибо, теперь он работает отлично! Я думаю, что я знаю, что вы имеете в виду, но до сих пор не понимаете, почему он работал отлично 3 недели назад (каждый раз, когда я тестировал его, как 20 раз), и теперь каждый раз не работает: D Если бы я получил ваш ответ правильно , это должно быть любопытно случайным ?! Ну, не важно, вы исправили это, большое спасибо! –

Смежные вопросы