如何在任务切换器中显示锁定屏幕并正确恢复

时间:2018-04-25 08:23:52

标签: ios swift locking

对于我正在开发的应用程序,我实现了一个锁定屏幕,允许用户通过手动pin或touch / Face-ID解锁应用程序。

在正常使用期间,一切正常。

但是,我需要在应用程序从后台甚至在任务切换器中恢复时显示锁定屏幕,以避免在没有正确解锁的情况下“窥视”内容。

根据Apple在此(旧)article中的建议,我在 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是确定最顶层视图控制器的有用扩展:Get top most UIViewController

lockVC.loginType = ... 只是让ViewController我需要什么类型的登录并稍微定制其视图

我得到的结果有点奇怪,无论是在模拟器还是真实设备上:

  • 我的应用的任务切换器预览是完全黑色的
  • 当应用程序恢复时,屏幕保持黑色,就像在预览中一样,没有响应。退出的唯一方法是杀死应用程序。
  • 在获得上面的奇怪结果之前,我必须访问所有商店作为可选项以避免终止...这对于 viewDidLoad 的东西很好(我没想到进入后台需要这个,因为视图之前已经加载了 - outlet有线)但奇怪的是我在 viewDidAppear 中的IBAction有相同的错误(如果touch / face-id是自动调用的触摸id按钮的IBAction可用 - 只是一个要求)。

我相信我在这里缺少一些大事......但没有找到其他提示。

没有一个现成的锁屏解决方案附带一个后台/ taskSwicth / resume案例。

请注意,如果我使用上面提到的最顶层视图控制器的扩展名,或者我只是尝试通过

来呈现它,那么黑/无响应的屏幕似乎都是相同的
self.window?.rootViewController?.present(lockVC, animated: false)

(我认为这是错误的,但无论如何都要尝试)

任何帮助都是apreciated

2 个答案:

答案 0 :(得分:0)

我找到了一个临时解决方法:

  1. 根据Core Language issue 453

  2. 的建议,当应用从后台变为有效时显示锁定屏幕
  3. 通过在应用程序发送到后台的当前屏幕上添加模糊效果( applicationWillResignActive )来隐藏任务切换器中的信息,并在应用再次激活时将其删除( applicationDidBecomeActive ),如建议Dev_Tandel

  4. 如上所述,这是我想分享的临时解决方法,但我不喜欢100%。需要在任务swtcher中显示锁定屏幕,并且我已经看过应用程序正在执行此操作(例如" here")。

    仍在寻求帮助。

答案 1 :(得分:0)

解决了,感谢post。 显然我试图用它的对象实例呈现一个视图控制器是天真的。

如果我使用

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

一切正常,锁屏也显示在任务切换器中,无需模糊!