I use this (my own) implementation for functionality you ask for both iOS 12 & iOS 13 support
AppDelegate:
private var blankWindow: BlankWindow?
// MARK: Shared AppDelegate
extension AppDelegate {
static func blankWindowShouldAppear(blankWindow: inout BlankWindow?) {
blankWindow = BlankWindow(frame: UIScreen.main.bounds)
blankWindow?.makeKeyAndVisible()
}
static func blankWindowShouldDisappear(window: UIWindow?, blankWindow: inout BlankWindow?) {
window?.makeKeyAndVisible()
blankWindow = nil
}
@available(iOS 13.0, *)
static func blankWindowShouldAppear(_ windowScene: UIWindowScene, blankWindow: inout BlankWindow?) {
blankWindow = BlankWindow(windowScene: windowScene)
blankWindow?.makeKeyAndVisible()
}
}
// MARK: Old life cycle methods
extension AppDelegate {
/// ⚠️ Methods here will not be called under iOS 13 due to new SceneDelegate life cycle
func applicationWillEnterBackground(_ application: UIApplication) {
AppDelegate.blankWindowShouldAppear(blankWindow: &blankWindow)
}
func applicationWillEnterForeground(_ application: UIApplication) {
AppDelegate.blankWindowShouldDisappear(window: window, blankWindow: &blankWindow)
}
}
SceneDelegate:
private var blankWindow: BlankWindow?
// MARK: New life cycle methods
@available(iOS 13.0, *)
extension SceneDelegate {
/// ⚠️ As for now, we use fallback to AppDelegate shared methods to reduce code duplication
/// Not all of the new life cycle methods are implemented here, yet
func sceneWillEnterForeground(_ scene: UIScene) {
AppDelegate.blankWindowShouldDisappear(window: window, blankWindow: &blankWindow)
}
func sceneWillEnterBackground(_ scene: UIScene) {
guard let windowScene = (scene as? UIWindowScene) else { return }
AppDelegate.blankWindowShouldAppear(windowScene, blankWindow: &blankWindow)
}
}
Where BlankWindow class is a UIWindow you wanna show to a user at this moment