Handling close and terminate app events (SwiftUI)
Asked Answered
B

3

13

How can I handle close and terminate app events in SwiftUI?

View
{
    ...
}.onDisappear {
    //My code
}

Working only when I change view, not when I close or terminate my app.

Breger answered 10/9, 2020 at 7:40 Comment(1)
I refer to beta software, so I am not allowed to provide any information on SO, but if you're using the new App and Scene protocols with WindowGroup container, then it is as presented in this Apple Developer Forum question titled "Using Core Data with SwiftUI App Protocol" and my answerDrag
V
16

You can use UIApplication.willTerminateNotification:

NotificationCenter.default.addObserver(forName: UIApplication.willTerminateNotification, object: nil, queue: .main) { _ in
    // terminating
}

This answer may explain better how to use it in SwiftUI:

Violaviolable answered 10/9, 2020 at 7:49 Comment(2)
This also works with NSApplication.willTerminateNotification if you are writing a Mac app.Aide
I had a hard time implementing an async func it looks like we only have about 5 seconds to do whatever we need and return. developer.apple.com/documentation/uikit/uiapplicationdelegate/…Ghiberti
G
16

You should use .onReceive modifier and Subscribe to the notification you want like this:

YourView()
    .onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification), perform: { output in
        // Code to run on will terminate
    })

You can use UIApplicationDelegate notifications and UIScene notifications

Docs:

Globule answered 10/6, 2021 at 8:11 Comment(2)
This does not get called on a view inside a WindowGroup, WindowGroup { ContentView(). onReceive ...Pettway
NSApplication.willTerminateNotification works on WindowGroup, however at least 1 window instance needs to be still open for it to trigger. If all windows are clossed and the app is quit/terminated, it does not trigger.Meanie
S
2

This work when you swipe up and close the app right away, but when you go to home screen and the close the app is not called.

class AppDelegate: NSObject, UIApplicationDelegate {

func applicationWillTerminate(_ application: UIApplication) {
       print("End App")
   }
Silvereye answered 28/8, 2023 at 8:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.