Określ stan tła za pomocą SwiftUI

Sep 10 2020

Podczas korzystania ze SwiftUI z iOS 13+ tradycyjne metody określania stanu tła przestają działać . Na przykład:

  • AppDelegate applicationDidEnterBackground(_ application: UIApplication)i applicationDidBecomeActive(_ application: UIApplication)nie daj się wywołać .

  • Powiadomienia didEnterBackgroundNotification, willEnterForegroundNotification, didBecomeActiveNotificationi willResignActiveNotificationnie dostać wysłana.

Jako alternatywa, istnieje UIWindowSceneDelegatecallbacks: sceneDidBecomeActive(_ scene: UIScene), sceneWillResignActive(_ scene: UIScene), sceneWillEnterForeground(_ scene: UIScene),sceneDidEnterBackground(_ scene: UIScene)

Problem z tymi zamianami polega na tym, że są one specyficzne dla jednej z wielu scen wchodzących i wychodzących z pierwszego planu. Nie zapewniają prostego i przejrzystego sposobu określenia, czy cała aplikacja jest na pierwszym planie, czy w tle.

Określenie statusu aplikacji na pierwszym planie / w tle jest ważne z powodów, które nie mają nic wspólnego z interfejsem użytkownika. Niektóre funkcje iOS zawodzą cicho, gdy aplikacja nie jest na pierwszym planie (dwa przykłady to skanowanie bluetooth z symbolami wieloznacznymi i transmisja iBeacon). Często tworzę struktury iOS, które nie mają żadnego interfejsu użytkownika, więc potrzebuję sposobu na określenie stanu tła / pierwszego planu aplikacji, nie polega na wklejaniu zestawu gotowego kodu wUIWindowSceneDelegate - nie jest rozsądne, gdybym prosił o to kogoś używającego mojego frameworka.

Czy istnieją proste sposoby określenia stanu pierwszego planu / tła aplikacji w systemie iOS 13 za pomocą SwiftUI?

Odpowiedzi

2 pawello2222 Sep 10 2020 at 04:07

Możesz również korzystać z UIApplicationpowiadomień w SwiftUI:

  • didEnterBackgroundNotification
  • willEnterForegroundNotification
  • didBecomeActiveNotification
  • willResignActiveNotification

Oto przykład:

NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { _ in
    // active
}

NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { _ in
    // inactive
}