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