如何解决使用SwiftUI确定背景状态
在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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。