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

Posted

技术标签:

【中文标题】如何在任务切换器中显示锁定屏幕并正确恢复【英文标题】:How to display lock sreen in task switcher and resume correctly 【发布时间】:2018-04-25 08:23:52 【问题描述】:

对于我正在开发的应用,我实现了一个锁定屏幕,允许用户通过手动锁定或触摸/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 的东西来说很好(我没想到进入后台时需要这个,因为之前已经加载了视图 - 插座已连接)但奇怪的是我在 viewDidAppear 中的 IBAction 遇到了相同的错误(如果 touch/face-id 是,则 IBAction for touch-id 按钮会自动调用)可用 - 只是一个要求)。

我相信我在这里遗漏了一些重要的东西......但没有找到其他提示。

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

请注意,如果我使用上述扩展来呈现最顶层的视图控制器,或者我只是尝试通过

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

(我认为这是错误的,但还是尝试了)

任何帮助将不胜感激

【问题讨论】:

当应用从后台激活时为什么不显示锁屏。 因为任务切换器需要锁屏显示 知道了,抱歉我错过了 【参考方案1】:

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

    如Dev_Tandel建议的那样,当应用从后台变为活动状态时显示锁定屏幕

    在任务切换器中隐藏信息,方法是在应用发送到后台的当前屏幕上添加模糊效果 (applicationWillResignActive) 并在应用再次激活时将其删除 (applicationDidBecomeActive),如建议here

如前所述,这是我想分享的临时解决方法,但我不喜欢 100%。需要在任务切换器中显示锁定屏幕,我见过应用程序这样做(例如“oneSafe”)。

仍在寻求帮助。

【讨论】:

【参考方案2】:

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

如果我使用

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

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

【讨论】:

以上是关于如何在任务切换器中显示锁定屏幕并正确恢复的主要内容,如果未能解决你的问题,请参考以下文章

iPhone iOS如何在应用程序从后台恢复时添加密码/密码锁定屏幕?

如何显示屏幕并运行一些“后台”任务(不使用线程)

如何在Android中保持kivy服务在后台运行(切换到其他应用程序或锁定屏幕时服务仍然运行)?

如何在android中启用“在锁定屏幕中显示”权限

如何使用C#锁定屏幕?

如何在恢复之前更新视图?