[英]applicationShouldTerminate called unexpectedly in macOS Swift app
許多人似乎有一個問題,即他們的 AppDelegate 的applicationShouldTerminate
永遠不會被調用。 我有相反的問題!
通常(估計有 20% 的時間)當我早上回到我的 Mac 時,我發現某些東西導致我的應用程序的applicationShouldTerminate
觸發。 然后我的應用程序運行它的清理代碼,之后applicationWillTerminate
被觸發。 然而,該應用程序從未關閉——它仍被標記為在我的 Dock 中運行,當我在那里單擊它時, applicationDidFinishLaunching
會觸發並啟動。 因為它已經在運行,所以停靠圖標不會反彈。
日志表明,這似乎只發生在我結束一天並且我的 Mac 進入睡眠狀態時,可能只有在電池耗盡后重新插入電源后才會發生。
起初我認為這可能是因為我的 Mac 試圖關閉應用程序以安裝系統更新,但即使沒有可用的更新也會發生這種情況。 而且我系統上的其他應用程序都沒有問題。
我在朋友的 Mac 上的應用程序也是如此。
我確實有一個“棘手的” applicationShouldTerminate
來解決運行循環問題(nb。我正在使用Promises ):
var shuttingDown: Bool = false
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
log.debug("applicationShouldTerminate")
if shuttingDown { return .terminateNow }
shuttingDown = true
StuffController.shared.terminateRunningStuff()
.timeout(20) // If it hasn't shutdown within 20 seconds, force it.
.always {
// Tell the app it should now actually terminate.
NSApplication.shared.terminate(self)
}
return .terminateCancel
}
誰能建議我的applicationShouldTerminate
在沒有用戶要求退出的情況下觸發的原因?
原來這是一個功能而不是一個錯誤(大聲笑)。 在 Mac OS X Lion (10.7) 中,Apple 引入了一項名為“ 自動終止”的功能,應用程序會在一段時間不活動后自動退出。
請注意,這旨在對最終用戶不可見; 該應用程序似乎正在擴展塢中運行,並且應該在需要時自行恢復,就好像什么都沒發生過一樣。
可以通過 Xcode 中的“應用程序可以被殺死以回收內存或其他特殊情況”配置啟用或禁用它(應用程序的Info.plist
的NSSupportsAutomaticTermination
鍵)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.