后台应用:关机前的NSAlert

时间:2015-07-07 22:42:46

标签: objective-c macos swift cocoa shutdown

我希望有一个状态栏应用程序,它会在系统关闭/重启之前显示NSAlert。 (只是一个NSStatusItem,没有窗口。)

它检测到关机并显示警报,但在用户与警报交互之前,应用程序已终止,系统将关闭。

有没有办法强制系统在系统关闭之前等待警报完成?

编辑:如果应用程序显示在Dock中,则代码确实有效,但如果它是NSApplicationActivationPolicy.AccessoryUI Element则无效。我试图在它退出之前将它恢复到Dock,但在它再次弹出之前它已被终止。

以下是代码示例:

func receivedPowerOffNotification(notification: NSNotification) {

        let myAlert: NSAlert = NSAlert()
        myAlert.alertStyle = NSAlertStyle.CriticalAlertStyle
        myAlert.messageText = "Title"
        myAlert.informativeText = "Please wait for this alert"
        myAlert.addButtonWithTitle("OK")
        myAlert.addButtonWithTitle("Not OK")
        let response = myAlert.runModal()
        if response != NSModalResponseOK {
            // Do something here before shutdown the system.
        }
    }
    NSApplication.sharedApplication().replyToApplicationShouldTerminate(true)
}

func applicationShouldTerminate(sender: NSApplication) -> NSApplicationTerminateReply {
    // userQuit = if the termination was caused by the Quit menu.
    return userQuit ? NSApplicationTerminateReply.TerminateNow : NSApplicationTerminateReply.TerminateLater
}

1 个答案:

答案 0 :(得分:1)

好的,在使用Apple的开发者技术支持 DTS )来回发送电子邮件后,简短回答是不可能的(对于< strong> LSUIElement / 代理以捕获关闭/重新启动进程):

来自Apple员工的引用:

  

AppKit中的规则更改为基于用户代理的应用程序。他们   旨在不与用户交互,即使通过我们的   文档说明您可以添加窗口。由于你的应用程序有一个   NSStatusItem,它构成一个UI,它不应该是用户代理   根据。在这种情况下,您正在与用户进行交互。

我确实问过是否有“内部”方式。答案仍然没有。