SwiftUI : macOS에서 앱 종료에 응답

Nov 21 2020

SwiftUI 2.0으로 크로스 플랫폼 앱을 만들고 있습니다. 앱의 수명주기는 SwiftUI에 의해 관리되므로 앱 또는 장면 대리자가 없습니다. 가능하다면 그대로 유지하고 싶습니다. 앱이 종료되거나 백그라운드로 들어갈 때 데이터를 유지하기 위해 scenePhase.

@main
struct MyApp: App {
    
    @Environment(\.scenePhase) var scenePhase
    @StateObject var dataModel = DataModel()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onChange(of: scenePhase) { newScenePhase in
                    switch newScenePhase {
                    case .background, .inactive:
                        dataModel.save()
                    default: break
                }
        }
    }
}

그러나이 접근 방식에는 고유 한 결함이 있습니다. macOS에서는 앱이 종료 될 때에서 변경 사항이 없으므로 scenePhase데이터가 유지되지 않습니다. 앱 종료를 감지하는 별도의 메커니즘이 있습니까? SwiftUI에 동등한 기능이 applicationWillTerminate:있습니까?

답변

1 Asperi Nov 21 2020 at 07:42

어댑터를 통해 애플리케이션 델리게이트를 삽입 할 수 있습니다. 다음 예제로 사용하십시오.

#if os(macOS)
class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }
}
#endif

@main
struct MyApp: App {

#if os(macOS)
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
#endif

    // ... other code
}