我正在尝试执行一些我之前放入应用程序委托中的代码,例如在进入后台时保存我的托管对象上下文。我把电话放在.onChange
对于 scenePhase,但我什么也没得到。这是一个示例项目:
import SwiftUI
@main
struct PhaseApp: App {
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
Text("Hello, world.")
}
.onChange(of: scenePhase) { phase in
switch phase {
case .active:
print("Active")
case .background:
print("Background")
case .inactive:
print("Inactive")
@unknown default: break
}
}
}
}
我希望每当我按 Home 或点击应用程序时,模拟器或我的测试设备上都会收到打印命令,但什么也没有发生。
我承认这个问题具体是关于schenePhase
但是,在 macOS 上我无法收到任何更改.background
当用户切换到不同的应用程序时发出通知。年龄较大的NotificationCenter
策略在两个平台上都按我的预期运作。我会将其添加到任何只是尝试执行某些代码的人的组合中,onForeground
/ onBackground
on iOS
and macOS
.
在任何视图上,您都可以附加:
.onReceive(NotificationCenter.default.publisher(for: .willResignActiveNotification)) { _ in
doBackgroundThing()
}
您可能关心的事件有:
- iOS: willResignActiveNotification & willEnterForegroundNotification
- macOS: willResignActiveNotification & willBecomeActiveNotification
你都可以找到NotificationCenter
Name
s here.
I use will*
背景的变体,因为我假设它们会在过程的早期被调用,并且我使用did*
前台的变体,因为无论应用程序是首次启动还是从后台启动,都会调用它们。
我使用这个扩展,所以我不必考虑平台差异:
extension View {
#if os(iOS)
func onBackground(_ f: @escaping () -> Void) -> some View {
self.onReceive(
NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification),
perform: { _ in f() }
)
}
func onForeground(_ f: @escaping () -> Void) -> some View {
self.onReceive(
NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification),
perform: { _ in f() }
)
}
#else
func onBackground(_ f: @escaping () -> Void) -> some View {
self.onReceive(
NotificationCenter.default.publisher(for: NSApplication.willResignActiveNotification),
perform: { _ in f() }
)
}
func onForeground(_ f: @escaping () -> Void) -> some View {
self.onReceive(
NotificationCenter.default.publisher(for: NSApplication.didBecomeActiveNotification),
perform: { _ in f() }
)
}
#endif
}
正如预期的那样,我这样使用它:
AppView()
.onBackground {
print("my background")
}
.onForeground {
print("my foreground")
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)