Приложение Swift имеет странное поведение при закрытии

Я разрабатываю приложение, которое использует Face/Touch ID при открытии. Я достиг этого, добавив эту функцию в мой MainViewController():

let context = LAContext()

    if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: nil) {
        context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "Verifying") { (success, err) in
            if success {
                DispatchQueue.main.async {
                    self.loginSuccessfull()
                    self.button.removeFromSuperview()
                }
            } else {
                if let err = err {
                    print(err)
                }
            }
        }
    }

Это вызывается как в ViewDidLoad, так и с помощью кнопки, как показано в этом видео. .

Как видите, когда я пытаюсь закрыть свое приложение, оно ведет себя очень странно, и я уверен, что это вызвано FaceID.

Любое предложение исправить это?

Журнал сбоев:

Error Domain=com.apple.LocalAuthentication Code=-4 "Caller moved to background." UserInfo={NSLocalizedDescription=Caller moved to background.}

person Vipera74    schedule 24.12.2019    source источник
comment
Можете ли вы описать, в чем странность? Я не вижу этого.   -  person Lou Franco    schedule 24.12.2019
comment
@LouFranco в конце, когда я закрываю приложение, телефон зависает и переходит на главный экран   -  person Vipera74    schedule 24.12.2019
comment
У вас есть журнал сбоев, которым вы можете поделиться?   -  person koen    schedule 25.12.2019
comment
@koen 2019-12-24 22:27:06.660868+0100 DemoApp[3266:786877] Can't end BackgroundTask: no background task exists with identifier 13 (0xd), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug. Error Domain=com.apple.LocalAuthentication Code=-4 "Caller moved to background." UserInfo={NSLocalizedDescription=Caller moved to background.}   -  person Vipera74    schedule 25.12.2019
comment
Возможно, это поможет: stackoverflow.com/questions/23882495/   -  person koen    schedule 25.12.2019
comment
@koen фактическая ошибка следующая (я только что отладил ее еще немного): Error Domain=com.apple.LocalAuthentication Code=-4 "Caller moved to background." UserInfo={NSLocalizedDescription=Caller moved to background.}   -  person Vipera74    schedule 25.12.2019
comment
Я столкнулся с той же проблемой!, в моем случае закрытие повтора вызывается 2 раза, один раз в обычном потоке. второй раз после принудительного выхода. Интересно, почему это??   -  person Gal Yedidovich    schedule 18.02.2020
comment
У вас есть код в AppDelegate applicationDidResignActive или applicationDidEnterBackground?   -  person Alexander    schedule 18.02.2020
comment
@Alexander в моем SceneDelegate sceneDidResignActive пусто, а в моем sceneDidEnterBackground есть только строка (UIApplication.shared.delegate as? AppDelegate)?.saveContext() (уже там, поскольку приложение использует CoreData)   -  person Vipera74    schedule 18.02.2020


Ответы (1)


Я считаю, что нашел решение проблемы, отложив оценку.

Я заметил, что когда у меня есть какая-либо задержка в пользовательском интерфейсе перед оценкой (например, анимация, которая перемещает логотип перед отображением предупреждения об идентификаторе лица), сбой полностью прекращается.

Итак, я сделал еще один тест с задержкой, например:

override func viewDidAppear(_ animated: Bool) {
    let context = LAContext()
    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Biometric test") { success, error in
                DispatchQueue.main.async {
                    if success {
                        doSome()
                    } else {
                        if let error = error { print(error) }
                    }
                }
            }
        }
    }
}

С этой реализацией у меня не было сбоев.

*Примечание: я также пробовал разные значения времени задержки, от 0,1 до 2,0 секунд, все сработало.

person Gal Yedidovich    schedule 23.02.2020
comment
Есть ли минимальная задержка для этого решения? - person Vipera74; 24.02.2020
comment
Ваш ответ работает, но на самом деле кажется обходным, а не правильным решением. Все равно помечено как решение - person Vipera74; 24.02.2020
comment
Я подозреваю, что когда возникает ошибка, при вызове оценки до завершения рендеринга контроллера (после viewDidAppear) - person Gal Yedidovich; 25.02.2020