【问题标题】:Determine background status with SwiftUI使用 SwiftUI 确定后台状态
【发布时间】:2020-12-28 06:44:36
【问题描述】:

在 iOS 13+ 中使用 SwiftUI 时,确定后台状态的传统方法不再起作用。例如:

  • AppDelegate 方法 applicationDidEnterBackground(_ application: UIApplication)applicationDidBecomeActive(_ application: UIApplication) 不会被调用。

  • 不发送通知didEnterBackgroundNotificationwillEnterForegroundNotificationdidBecomeActiveNotificationwillResignActiveNotification

作为替代方案,还有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


【解决方案1】:

您也可以在 SwiftUI 中使用UIApplication 通知:

  • didEnterBackgroundNotification
  • willEnterForegroundNotification
  • didBecomeActiveNotification
  • willResignActiveNotification

这是一个例子:

NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { _ in
    // active
}

NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { _ in
    // inactive
}

【讨论】:

  • 这是正确的。我在我的问题中声明这些不起作用是错误的。
【解决方案2】:

我相信在 SwiftUI 中处理事件的正确方法是使用 onReceive 方法。

Text("Hello, World!")
    .onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in
        // Action
    }

【讨论】:

  • 虽然上述方法可能适用于特定场景,但问题是如何确定跨多个场景的整个应用程序的前景/背景状态
猜你喜欢
  • 2023-03-09
  • 2022-09-28
  • 2022-10-19
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多