使用 SwiftUI 确定后台状态

Determine background status with SwiftUI

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

作为替代方案,有 UIWindowSceneDelegate 回调:sceneDidBecomeActive(_ scene: UIScene)sceneWillResignActive(_ scene: UIScene)sceneWillEnterForeground(_ scene: UIScene)sceneDidEnterBackground(_ scene: UIScene)

这些替换的问题在于它们特定于进入和离开前景的多个场景之一。它们没有提供一种简单明了的方法来确定整个应用程序是在前台还是在后台。

确定应用程序 foreground/background 状态很重要,原因与用户界面无关。 某些 iOS 功能会在应用程序启动时静默失败不在前台(通配符蓝牙扫描和 iBeacon 传输是两个例子。)我经常开发 iOS 没有任何用户界面的框架,所以 我需要一种方法来确定应用程序 background/foreground不依赖于在 UIWindowSceneDelegate 中粘贴一堆样板代码的状态——我要求使用我的框架的人这样做是不合理的。

是否有任何直接的方法可以使用 SwiftUI 确定应用程序在 iOS 13 上的 foreground/background 状态?

您也可以在 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
}

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

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