SwiftUI:macOSでアプリの終了に応答する

Nov 21 2020

SwiftUI2.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
}