Swift - Фоновый поток вылетает приложение с аутентификацией - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь добавить идентификатор лица / Touch ID / код в свое приложение, но у меня возникают некоторые проблемы, когда я прекращаю его: вот ошибка, которую я получаю (с небольшими изменениями между запусками, например, номер изменяемого идентификатора):

Не удается завершить BackgroundTask: фоновая задача с идентификатором 12 не существует (0x c), или она может быть уже завершена. Перерыв в UIApplicationEndBackgroundTaskError () для отладки.

Я пытался следовать инструкциям, но не мог понять, что делать. На inte rnet я обнаружил, что это может быть ошибка, вызванная iOS 13, но у меня нет устройства под управлением iOS 12, чтобы проверить его.

Там нет любой кра sh войдите в мои настройки.

Вот код, вызывающий ошибку:

import UIKit
import LocalAuthentication

class LoginController: VController {

override func viewDidLoad() {
    super.viewDidLoad()

    let context = LAContext()
    var error: NSError?
    let reason = "Identificati"

    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { (success, err) in
            DispatchQueue.main.async {
                if success {
                    context.invalidate()
                    let layout = UICollectionViewFlowLayout.init()
                    let dim = (UIScreen.main.bounds.width / 2) - 12
                    layout.itemSize = CGSize(width: dim, height: dim)
                    layout.sectionInset = UIEdgeInsets(top: 6, left: 6, bottom: 6, right: 6)
                    let vc = UINavigationController(rootViewController: ViewController(collectionViewLayout: layout))
                    vc.modalPresentationStyle = .fullScreen
                    self.present(vc, animated: true, completion: nil)
                } else {
                    print(err!.localizedDescription)
                }
            }
        }

    } else {
        if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
            context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { (success, err) in
                DispatchQueue.main.async {
                    if success {
                        context.invalidate()
                        let layout = UICollectionViewFlowLayout.init()
                        let dim = (UIScreen.main.bounds.width / 2) - 12
                        layout.itemSize = CGSize(width: dim, height: dim)
                        layout.sectionInset = UIEdgeInsets(top: 6, left: 6, bottom: 6, right: 6)
                        let vc = UINavigationController(rootViewController: ViewController(collectionViewLayout: layout))
                        vc.modalPresentationStyle = .fullScreen
                        self.present(vc, animated: true, completion: nil)
                    } else {
                        print(err!.localizedDescription)
                    }
                }
            }

        } else {
            // Nothing worked
        }
    }
  }

}

1 Ответ

1 голос
/ 07 января 2020

Вызовите функцию invalidate() в вашем контексте после того, как вы закончите с ней.

...