Determinar o status do plano de fundo com SwiftUI

Sep 10 2020

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)e applicationDidBecomeActive(_ application: UIApplication)não são chamados.

  • Notificações didEnterBackgroundNotification, willEnterForegroundNotification, didBecomeActiveNotificatione willResignActiveNotificationnã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

2 pawello2222 Sep 10 2020 at 04:07

Você também pode usar as UIApplicationnotificações no SwiftUI:

  • didEnterBackgroundNotification
  • willEnterForegroundNotification
  • didBecomeActiveNotification
  • willResignActiveNotification

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
}