Determinar o status do plano de fundo com SwiftUI
Ao usar o SwiftUI com iOS 13+, o meio tradicional de determinar o estado do segundo plano não funciona mais . Por exemplo:
Métodos AppDelegate
applicationDidEnterBackground(_ application: UIApplication)eapplicationDidBecomeActive(_ application: UIApplication)não são chamados.Notificações
didEnterBackgroundNotification,willEnterForegroundNotification,didBecomeActiveNotificationewillResignActiveNotificationnão são enviados.
Como alternativa, existem UIWindowSceneDelegateretornos de chamada: sceneDidBecomeActive(_ scene: UIScene), sceneWillResignActive(_ scene: UIScene), sceneWillEnterForeground(_ scene: UIScene),sceneDidEnterBackground(_ scene: UIScene)
O problema com essas substituições é que elas são específicas para uma das várias cenas que estão entrando e saindo do primeiro plano. Eles não fornecem uma maneira simples e limpa de determinar se todo o aplicativo está em primeiro ou segundo plano.
Determinar o status de primeiro / segundo plano do aplicativo é importante por motivos que nada têm a ver com a interface do usuário. Alguns recursos do iOS falham silenciosamente quando o aplicativo não está em primeiro plano (varredura de bluetooth curinga e transmissão iBeacon são dois exemplos.) Eu frequentemente desenvolvo estruturas de iOS que não têm interface de usuário, então preciso determinar o estado de fundo / primeiro plano do aplicativo que não depende da colagem de um monte de código clichê noUIWindowSceneDelegate - não é razoável para mim pedir a alguém que esteja usando minha estrutura para fazer isso.
Existe alguma maneira simples de determinar o status de primeiro / segundo plano dos aplicativos no iOS 13 com SwiftUI?
Respostas
Você também pode usar as UIApplicationnotificações no SwiftUI:
didEnterBackgroundNotificationwillEnterForegroundNotificationdidBecomeActiveNotificationwillResignActiveNotification
Aqui está um exemplo:
NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { _ in
// active
}
NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { _ in
// inactive
}