Search code examples
iosswiftuikitios13

Show window that covers everything when apps enters background


In iOS12 and below I used to use something similar to this to show a window on top of everything to cover my app contents. This use to work but in iOS13 betas this does not work anymore.

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
    }

}

Apparently window changes are not reflected in screen until app enters foreground again.

Question

Does anyone know how fix or workaround this? or maybe this approach is incorrect?

Any help would be highly appreciated

Notes

  1. I don't use a simple view because my app might be showing other windows too and my requirement is to cover everything.

  2. I don't use applicationWillResignActive because we want to only show coverWindow when it enters background. (TouchID authentication and other stuff might trigger applicationWillResignActive and coverWindow would incorrectly show)

Example code

Download Full working example code in Github (Run in iOS simulator 12 and 13 to see the difference)


Solution

  • Answer to myself.

    I reported this to Apple and it was fixed in iOS 13.1 or so. Latest version of iOS13 does NOT have this bug :)