【发布时间】:2020-12-28 06:44:36
【问题描述】:
在 iOS 13+ 中使用 SwiftUI 时,确定后台状态的传统方法不再起作用。例如:
-
AppDelegate 方法
applicationDidEnterBackground(_ application: UIApplication)和applicationDidBecomeActive(_ application: UIApplication)不会被调用。 -
不发送通知
didEnterBackgroundNotification、willEnterForegroundNotification、didBecomeActiveNotification和willResignActiveNotification。
作为替代方案,还有UIWindowSceneDelegate 回调:sceneDidBecomeActive(_ scene: UIScene)、sceneWillResignActive(_ scene: UIScene)、sceneWillEnterForeground(_ scene: UIScene)、sceneDidEnterBackground(_ scene: UIScene)
这些替换的问题在于它们特定于进入和离开前景的多个场景之一。它们没有提供一种简单而干净的方法来确定整个应用程序是在前台还是后台。
确定应用程序的前台/后台状态很重要,原因与用户界面无关。 当应用程序不在前台时(通配符蓝牙扫描和 iBeacon 传输),一些 iOS 功能会静默失败是两个例子。)我经常开发没有任何用户界面的 iOS 框架,所以 我需要一种方法来确定应用程序的背景/前台状态,而不是依赖于在 UIWindowSceneDelegate 中粘贴一堆样板代码 -- 让使用我的框架的人来做这件事对我来说是不合理的。
在 iOS 13 上使用 SwiftUI 是否有任何直接的方法来确定应用的前台/后台状态?
【问题讨论】:
-
NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { _ in不适合你吗? -
@pawello222,我的立场是正确的。与我在问题中所说的相反,我说不触发的四个通知仍然触发。我确定上次尝试没有发生这种情况,但显然我错了。如果您将此作为答案,我将很乐意接受。
-
在 WWDC19 Introducing Multiple Windows on iPad 中有对这种可能的“差异”的解释; 17:06 左右有一张图表,但整个谈话内容非常丰富
标签: swiftui ios13 appdelegate nsnotificationcenter uiscenedelegate