Как отобразить экран блокировки в переключателе задач и правильно возобновить работу - PullRequest
0 голосов
/ 25 апреля 2018

для приложения, которое я разрабатываю, я реализовал экран блокировки, который позволяет пользователю разблокировать приложение с помощью ручного штифта или касания / 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)

(что я считаю неправильным, но все равно пытался)

Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Решено, благодаря этому сообщению .Очевидно, я был наивен в попытке представить контроллер представления только с его экземпляром объекта.

Если я использую

let lockVC = topViewController.storyboard?.instantiateViewController(withIdentifier: "IDLoginViewController") as! LoginViewController

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

0 голосов
/ 25 апреля 2018

Я нашел временное решение:

  1. Отображение экрана блокировки, когда приложение становится активным из фона, как предложено Dev_Tandel

  2. Скрыть информацию в переключателе задач, добавив эффект размытия на текущий экран, на котором приложение отправлено в фоновый режим ( applicationWillResignActive ), и удалите его, когда приложение снова станет активным ( applicationDidBecomeActive ), как предложено здесь

Как уже говорилось, это временный обходной путь, которым я хотел бы поделиться, но мне не нравятся эти 100%. Необходимо отобразить экран блокировки в переключателе задач, и я видел, как приложения делают это (например, " oneSafe ").

Все еще в поисках помощи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...