使用SwiftUI确定后台状态

使用SwiftUI确定后台状态,swiftui,ios13,appdelegate,nsnotificationcenter,uiscenedelegate,Swiftui,Ios13,Appdelegate,Nsnotificationcenter,Uiscenedelegate,在iOS 13+上使用SwiftUI时,确定背景状态的传统方法不再有效。例如: AppDelegate方法ApplicationIdentinterBackground(\uApplication:UIApplication)和ApplicationIDBecMeactive(\uApplication:UIApplication)不会被调用 不会发送通知didEnterBackgroundNotification,willEnterForegroundNotification,didBec

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

  • AppDelegate方法
    ApplicationIdentinterBackground(\uApplication:UIApplication)
    ApplicationIDBecMeactive(\uApplication:UIApplication)
    不会被调用

  • 不会发送通知
    didEnterBackgroundNotification
    willEnterForegroundNotification
    didBecomeActiveNotification
    willResignActiveNotification

另外,还有
UIWindowSceneDelegate
回调:
sceneDidBecomeActive(\uscene:UIScene)
sceneWillResignActive(\uscene:UIScene)
sceneDidEnterBackground(\uscene:UIScene)

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

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


使用SwiftUI在iOS 13上确定应用程序的前台/后台状态有什么简单的方法吗?

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

  • dienterbackgroundnotification
  • willEnterForegroundNotification
  • didBecomeActiveNotification
  • willresignactivatenotification
以下是一个例子:

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中处理事件的正确方法是使用该方法

Text(“你好,世界!”)
.onReceive(NotificationCenter.default.publisher(for:UIApplication.didEnterBackgroundNotification)){in
//行动
}

Does
NotificationCenter.default.addObserver(forName:UIApplication.didBecomeActiveNotification,对象:nil,队列:.main){在
不为你工作?@pawello222,我的回答是正确的。与我在问题中所说的相反,我所说的四个通知“不开火”仍然会开火。我确信我上次尝试时没有发生这种情况,但显然我错了。如果你做出这样的回答,我将欣然接受。在WWDC19中,对此可能有一个解释“差异”;大约在17:06有一张图表,但整个演讲都是非常有信息性的。这是正确的。我在问题中关于这些不起作用的陈述是错误的。虽然上面的内容对于特定场景可能非常有效,但问题是如何在多个场景中确定整个应用程序的前景/背景状态