使用 SwiftUI 确定后台状态

dav*_*ung 2 nsnotificationcenter appdelegate ios13 swiftui uiscenedelegate

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

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

  • 不会发送通知didEnterBackgroundNotificationwillEnterForegroundNotificationdidBecomeActiveNotificationwillResignActiveNotification

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

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

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

是否有任何简单的方法可以使用 SwiftUI 确定 iOS 13 上应用程序的前台/后台状态?

paw*_*222 5

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

  • 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
}
Run Code Online (Sandbox Code Playgroud)


Haj*_*oud 5

正确的方法是根本不使用NotificationCenter,而是使用 \xe2\x80\x9cscenePhase\xe2\x80\x9d 环境对象。可用于任何需要查看状态或整个应用程序的 SwiftUI 视图。

\n
@main\n\nstruct ExampleApp: App {\n    \n    @Environment(\\.scenePhase) var scenePhase\n    \n    var body: some Scene {\n        WindowGroup {\n            MainView()\n                .onChange(of: scenePhase) { phase in\n                    switch phase {\n                    case .background:\n                        print("App is background")\n                    case .inactive:\n                        print("App is inactive")\n                    case .active:\n                        print("App is active")\n                    @unknown default:\n                        print("Phase is unknown")\n                    }\n                }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n