应用程序进入后台时如何在 iOS 13 上显示自定义启动画面?

Posted

技术标签:

【中文标题】应用程序进入后台时如何在 iOS 13 上显示自定义启动画面?【英文标题】:How to show custom splash screen on iOS 13 when app enters background? 【发布时间】:2019-10-09 09:02:00 【问题描述】:

问题和这个类似:

Display a view or splash screen before applicationDidEnterBackground (to avoid active view screenshot)

上面的链接还展示了如何实现它的代码示例。

当应用程序在“多任务屏幕”上进入背景时,我需要显示例如白屏:

问题是这种方式在 ios 13 上不起作用!如何解决这个问题?

【问题讨论】:

【参考方案1】:

您在 UIWindowSceneDelegate 方法中证明了这一点。实现你想要的任何逻辑。

func sceneDidEnterBackground(_ scene: UIScene)

【讨论】:

也许吧。但是该项目是从不知道UIWindowSceneDelegateSwiftUI 的旧Xcode 版本开始开发的。项目是否应该基于SwiftUI 才能使用? 它不一定要基于 SwiftUI 好的,如何将UIWindowSceneDelegate 添加到现有项目中? 无论如何,您都不必为 iOS 13 使用 UIWindowSceneDelegate。您的应用委托是否符合UIApplicationDelegate 我在我的自定义课程中订阅了UIApplicationDidEnterBackground。代码与之前的 iOS 版本一样执行,但 UI 中没有任何反应。【参考方案2】:

我将这个(我自己的)实现用于您要求 iOS 12 和 iOS 13 支持的功能

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)
    

场景代理

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)
    

BlankWindow 类是您此时要向用户显示的 UIWindow

【讨论】:

如果你能提供 BlankWIdow 实现会很好 @Async- BlankWindow 可以是 UIWindow 的任何子类,您可以根据需要自定义它。现在有专门的或通用的实现:)

以上是关于应用程序进入后台时如何在 iOS 13 上显示自定义启动画面?的主要内容,如果未能解决你的问题,请参考以下文章

应用进入后台时避免外接显示器显示原生 iOS 屏幕

iOS 13 导航栏问题 - 部分导航栏变得透明

ios10自定手势有啥用

怎么让ios不自动关闭后台程序

每次我的应用程序从后台进入前台时,IOS Default.png 都会显示 [重复]

在 iOS 上,当应用程序进入后台时 UnityWebRequest 下载停止