有什么方法可以在进程退出时杀死swift4中的OSX通知

时间:2019-02-07 20:56:42

标签: swift macos

我一直在寻找寻找答案的小时,但是我找不到任何有用的信息。

基本上,我有一个超级基本的命令行应用程序,它只会创建一个通知。它可以工作,但是在CLI进程终止时,OSX通知仍然存在。单击该按钮不会执行任何操作。

此应用是Swift 4可口可乐应用,它使用 AppDelegate 类并扩展了NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate

applicationWillTerminate()中,我认为此函数将在现有进程中调用。

我想知道当通过SIGTERM / SIGINT终止该进程时是否可以运行一个命令,并且/或者在该进程退出时关闭该通知?

感谢您的帮助!我对Swift有点陌生,它给了我一个很好的迅速表现:)

1 个答案:

答案 0 :(得分:1)

applicationWillTerminate被调用以响应调用NSApplication.terminate(_:)。 Cocoa调用此命令是为了响应用户界面操作,例如使用File-> Quit,但它没有注册信号处理程序。为您的命令行应用程序注册此类信号处理程序的一种简单方法是使用DispatchSource.makeSignalSource

signal(SIGINT, SIG_IGN)
let sigint = DispatchSource.makeSignalSource(signal: SIGINT, queue: DispatchQueue.main)
sigint.setEventHandler {
    NSApp.terminate(nil)
}
sigint.resume()

对于其他可以处理的信号,例如SIGQUITSIGTERM,您可以做同样的事情(尽管我认为不理会SIGTERM是公平的)。

我建议您保留sigint作为实例变量,以确保该对象不会消失。不过,我不确定是否有必要。

您在信号分配源事件处理程序中调用的函数不必是异步信号安全的,因为它们的处理被推迟了。有关详细信息,请参见Dispatch Sources: Monitoring Signals(文档使用C API,但语义相同)。