для приложения, которое я разрабатываю, я реализовал экран блокировки, который позволяет пользователю разблокировать приложение с помощью ручного штифта или касания / Face-ID.
Все работает нормально при нормальном использовании.
Однако мне нужно показать экран блокировки, когда приложение возобновляется из фона и даже в переключателе задач, чтобы избежать «просмотра» содержимого без надлежащей разблокировки.
Как рекомендовано Apple в этой (старой) статье , я представляю контроллер представления блокировки в applicationDidEnterBackground :
func applicationDidEnterBackground(_ application: UIApplication) {
let lockVC = LoginViewController()
lockVC.loginType = LoginViewController.LoginType.resumeApp
if let topViewController = UIApplication.topViewController() {
topViewController.present(lockVC, animated: false, completion: nil)
}
}
где topViewControler - полезное расширение для определения самого верхнего контроллера вида: Получить самый верхний UIViewController
.
lockVC.loginType = ... просто позволяет ViewController, какой тип входа мне нужен, и немного настраивает его представление
Результаты, которые я получаю, немного странные как на симуляторе, так и на реальных устройствах:
- Предварительный просмотр переключателя задач для моего приложения полностью черный
- при возобновлении работы приложения экран остается черным, как при предварительном просмотре, и не отвечает. Единственный выход - убить приложение.
- перед тем, как получить странные результаты, описанные выше, я должен был получить доступ ко всем розеткам как необязательный, чтобы избежать завершения ... это нормально для viewDidLoad (я не ожидал необходимости при вводе фона, так как представление было загружено ранее - розетка подключена), но странно то, что у меня была такая же ошибка для IBAction в viewDidAppear (IBAction для кнопки touch-id вызывается автоматически, если доступен touch / face-id - просто требование).
Полагаю, мне здесь чего-то не хватает ... но других подсказок не найдено.
Ни одно из готовых решений для экрана блокировки не поставляется с примером для дела background / taskSwicth / resume).
Обратите внимание, что черный / не отвечающий экран выглядит одинаково, если я использую упомянутое расширение для представления контроллера верхнего вида или просто пытаюсь представить его с помощью
self.window?.rootViewController?.present(lockVC, animated: false)
(что я считаю неправильным, но все равно пытался)
Любая помощь будет оценена