swift - TouchID долго загружается

Я работаю над интеграцией touchID в свое приложение. Процесс был довольно простым, но даже с использованием моих фиктивных данных требуется около 5 секунд после аутентификации моего отпечатка пальца, прежде чем он выполнит свою задачу.

Вот мой код:

func requestFingerprintAuthentication() {
    let context = LAContext()
    var authError: NSError?
    let authenticationReason: String = "Login"

    if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &authError) {
        context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: authenticationReason, reply: {
            (success: Bool, error: NSError?) -> Void in
            if success {
                println("successfull signin with touchID")
                self.emailInputField.text = "[email protected]"
                self.passwordInputField.text = "password"
                self.signIn(self.signInButton)
            } else {
                println("Unable to Authenticate touchID")
            }
        })
    }
}

даже с фиктивными данными это занимает слишком много времени.

Когда я обычно вхожу в систему, вводя адрес электронной почты и пароль в поля ввода, функция signIn() запускается мгновенно.

Чтобы понять, не в этом ли проблема. Я попытался заменить это двумя строками, которые просто приводят меня к правильному viewController. Но это все еще занимает несколько секунд после того, как он аутентифицирует мой отпечаток пальца.

Я знаю, что дело не в телефоне и не в touchID. Потому что он немедленно запускает мой println("успешный вход с touchID"). Это то, что происходит после этого, что по какой-то причине требуется несколько секунд для его запуска?

Любая помощь, объясняющая это, будет принята с благодарностью!


person MLyck    schedule 10.03.2015    source источник


Ответы (1)


В документации указано:

Этот метод асинхронно оценивает политику проверки подлинности.

Вы запускаете код пользовательского интерфейса в потоке, который не является основным. Оберните свой код, чтобы заставить его выполняться в основном потоке:

func requestFingerprintAuthentication() {
let context = LAContext()
var authError: NSError?
let authenticationReason: String = "Login"

if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &authError) {
    context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: authenticationReason, reply: {
        (success: Bool, error: NSError?) -> Void in
        if success {
            NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                println("successfull signin with touchID")
                self.emailInputField.text = "[email protected]"
                self.passwordInputField.text = "password"
                self.signIn(self.signInButton)
            })
        } else {
            println("Unable to Authenticate touchID")
        }
    })
}

}

person Gary Riches    schedule 10.03.2015
comment
Большое спасибо за вашу помощь, Гэри!, это сработало отлично. - person MLyck; 10.03.2015