问题描述
在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)
这些替换的问题在于它们特定于进入和离开前景的多个场景之一。它们没有提供一种简单干净的方法来确定整个应用程序是在前台还是在后台。
确定应用程序的前台/后台状态非常重要,原因与用户界面无关。当某些应用程序不在前台时,某些iOS功能会以静默方式失败(通配符蓝牙扫描和iBeacon传输)有两个例子。)我经常开发没有任何用户界面的iOS框架,因此我需要一种不依赖于在UIWindowSceneDelegate
上粘贴大量样板代码的方法来确定应用程序背景/前景状态-我问一个使用我的框架的人这样做是不合理的。
是否有任何直接方法可以通过SwiftUI在iOS 13上确定应用程序的前台/后台状态?
解决方法
您也可以在SwiftUI中使用UIApplication
通知:
-
didEnterBackgroundNotification
-
willEnterForegroundNotification
-
didBecomeActiveNotification
-
willResignActiveNotification
这里是一个例子:
NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification,object: nil,queue: .main) { _ in
// active
}
NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification,queue: .main) { _ in
// inactive
}
,
我认为在 SwiftUI 中处理事件的正确方法是使用 onReceive 方法。
parallelize workers: 4