Określ stan tła za pomocą SwiftUI
Podczas korzystania ze SwiftUI z iOS 13+ tradycyjne metody określania stanu tła przestają działać . Na przykład:
AppDelegate
applicationDidEnterBackground(_ application: UIApplication)iapplicationDidBecomeActive(_ application: UIApplication)nie daj się wywołać .Powiadomienia
didEnterBackgroundNotification,willEnterForegroundNotification,didBecomeActiveNotificationiwillResignActiveNotificationnie 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
Możesz również korzystać z UIApplicationpowiadomień w SwiftUI:
didEnterBackgroundNotificationwillEnterForegroundNotificationdidBecomeActiveNotificationwillResignActiveNotification
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
}