当应用程序进入后台时显示覆盖所有内容的窗口

3
在iOS12及以下版本中,我使用类似于以下内容的方法来显示一个窗口,以覆盖我的应用程序内容并置于最上方。这种方法曾经有效,但在iOS13测试版中不再起作用了。
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var coverWindow: UIWindow?

    func applicationDidEnterBackground(_ application: UIApplication) {
        if self.coverWindow != nil {
            // Skip since cover window is already showing
            return
        }
        let vc = UIViewController()
        let label = UILabel(frame: window!.bounds)
        label.text = "CoverWindow. Tap to app see contents"
        vc.view = label
        vc.view.backgroundColor = UIColor.lightGray
        let coverWindow = UIWindow(frame: window!.bounds)
        coverWindow.rootViewController = vc
        coverWindow.windowLevel = .alert
        coverWindow.makeKeyAndVisible()
        self.coverWindow = coverWindow
    }

}

显然,窗口更改直到应用程序再次进入前台才会在屏幕上显示。

问题

有人知道如何修复或解决这个问题吗?或者这种方法是不正确的?

任何帮助都将不胜感激

注意事项

  1. 我不使用简单的视图,因为我的应用程序可能也会显示其他窗口,而且我的要求是覆盖所有内容。

  2. 我不使用applicationWillResignActive,因为我们只想在应用程序进入后台时显示 coverWindow。(TouchID身份验证和其他操作可能会触发 applicationWillResignActive,导致 coverWindow 错误显示)

示例代码

下载完整的工作示例代码,请访问Github(在iOS模拟器12和13中运行以查看差异)


我建议使用applicationWillResignActive,这样做更可靠。当用户返回活动状态时,可以显示touchID。 - Tj3n
TouchID 验证弹窗会让应用进入“resign active”状态。不仅 TouchID,推送通知授权弹窗以及其他许多服务也会如此。在每种情况下,我都需要使用一个 BOOL 标志。如果可能的话,我想避免采用这种方法。 - nacho4d
嗨,你找到解决方案了吗? - birdy
2个回答

0

你需要实现应用程序生命周期,只需删除它,添加这些应用程序生命周期函数并实现你的代码,它将能够无误运行。


我有什么遗漏吗?应用程序生命周期方法是可选的。我删除了它们,因为我认为在这个例子中它们不是必需的。这在iOS12及以下版本(从iOS9到iOS12)中运行良好。我想知道缺少哪种方法。 - nacho4d

0

回答自己。

我向苹果报告了这个问题,它在iOS 13.1或者之后的版本中得到了修复。最新版本的iOS13没有这个bug :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接