3

我正在尝试将新的 App 协议用于新的 SwiftUI 应用程序,并且我需要在应用程序级别检测到 .background 的场景相位更改,以便将少量应用程序数据保存到 .plist 文件中。我不知道这是一个错误还是我做错了什么,但它没有按预期工作。一旦点击按钮,当场景仍处于活动状态时,scenePhase 将更改为 .background!为了展示这种奇怪行为的一个例子,我展示了这个简单的代码:

class DataModel: ObservableObject {
    @Published var count = 0
}

@main
struct TestAppProtocolApp: App {
    @Environment(\.scenePhase) private var scenePhase
    @StateObject private var model: DataModel = DataModel()
    
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(model)
        }
        .onChange(of: scenePhase) { newScenePhase in
            switch newScenePhase {
            case .active:
                print("Scene is active.")
            case .inactive:
                print("Scene is inactive.")
            case .background:
                print("Scene is in the background.")
            @unknown default:
                print("Scene is in an unknown state.")
            }
        }
    }
}

struct ContentView: View {
    @EnvironmentObject var model: DataModel
    
    var body: some View {
        VStack {
            Button(action: { model.count += 1 }) {
                Text("Increment")
            }
            .padding()
            Text("\(model.count)")
        }
    }
}

当点击增量按钮时,scenePhase 变为 .background,然后,当 App 真正被发送到后台时,scenePhase 不会改变。

我发现将 .onChange(of: scenePhase) 移动到 View (ContentView) 可以正常工作,但 Apple 宣布您可以在 App 级别监控任何 scenePhase 更改,而这正是我在 View 级别不想要的。

4

3 回答 3

1

我也遇到了类似的问题,scenePhase 根本不工作,然后它工作了,但没有像预期的那样。尝试从您的财产中仅删除“@StateObject private”,您可能会得到其他结果。我希望新的测试版能解决这个问题。

于 2020-07-05T19:27:30.273 回答
0

顺便说一句,在 SwiftUI 2+ 中保留应用范围内的少量数据的推荐方法是通过 @AppStorage 属性包装器,它本身依赖于 UserDefaults。以下是我们如何检测首次启动并切换标志:

struct MainView: View {
@AppStorage("isFirstLaunch") var isFirstLaunch: Bool = true
var body: some View {
        Text("Hello, world!")
            .sheet(isPresented: $isFirstLaunch, onDismiss: { isFirstLaunch = false }) {
                Text("This is the first time app is launched. The sheet will not be shown again once dismissed.")
            }
    }
}
于 2020-08-11T15:18:52.397 回答
0

Xcode12 beta 6 似乎解决了这个问题。现在它按预期工作。

于 2020-08-28T20:02:40.887 回答