簡體   English   中英

在 macOS Swift 應用程序中意外調用 applicationShouldTerminate

[英]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.plistNSSupportsAutomaticTermination鍵)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM