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

Posted

技术标签:

【中文标题】当应用程序进入后台时显示覆盖所有内容的窗口【英文标题】:Show window that covers everything when apps enters background 【发布时间】:2019-09-04 02:14:25 【问题描述】:

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
    



显然,在应用再次进入前台之前,窗口更改不会反映在屏幕上。

问题

有谁知道如何解决或解决这个问题?或者这种方法不正确?

任何帮助将不胜感激

注意事项

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

    我不使用applicationWillResignActive,因为我们只想在coverWindow 进入背景时显示它。 (TouchID 身份验证和其他东西可能会触发applicationWillResignActive 并且coverWindow 会错误显示)

示例代码

下载Full working example code in Github(在iOS模拟器12和13中运行看看区别)

【问题讨论】:

我建议使用applicationWillResignActive,这样做更可靠,您可以在用户回到活动状态时显示touchID TouchID 身份验证警报实际上使应用程序退出活动状态。不仅是 TouchID,还有推送通知接受警报和许多其他服务。我需要在每种情况下都使用 BOOL 标志......如果可能的话,我想避免这种方法 您好,您找到解决方案了吗? 【参考方案1】:

你要实现应用的生命周期,你把它删掉,加上那些应用生命周期的功能,然后实现你的代码,它就可以正常运行了

【讨论】:

我错过了什么吗?应用程序生命周期方法是可选的。我删除是因为我认为在此示例中不需要它们。这在 iOS12 及以下(从 iOS9 到 iOS12)中运行良好。我想知道缺少什么方法【参考方案2】:

自己回答。

我向 Apple 报告了这个问题,它在 iOS 13.1 左右得到了修复。最新版本的 iOS13 没有这个 bug :)

【讨论】:

以上是关于当应用程序进入后台时显示覆盖所有内容的窗口的主要内容,如果未能解决你的问题,请参考以下文章

在后台运行时显示弹出窗口的权限

使用 Parse 推送通知:当应用程序处于后台时显示警报

以编程方式更新桌面“拖动时显示窗口内容”设置

如何在后台运行android应用程序时显示通话屏幕

本地通知在后台显示应用程序时显示 uialertview

尝试在点击单元格时显示其视图不在窗口层次结构中