Как получить уведомление, когда закрывается невидимое приложение Mac OSX? - applicationWillTerminate() не вызывается

У меня есть приложение Mac, чей обработчик applicationWillTerminate:(NSNotification *) не вызывается, когда приложение закрывается. Существует некоторый код очистки памяти C++, который должен быть вызван, если программа закрыта, поэтому мне нужен какой-то способ сделать это.

Кажется, причина, по которой он не вызывается, связана с тем, что я добавил следующий ключ в Info.plist:

<key>LSUIElement</key>
<true/>

Я читал другие вопросы и ответы по этой теме, например applicationWillTerminate: не вызывается и applicationWillTerminate не вызывается (принятый правильный ответ не работает). applicationDidEnterBackground() также никогда не запускается. applicationDidFinishLaunching() всегда срабатывает нормально. Я возвращаю NSTerminateNow, если applicationShouldTerminate() когда-либо вызывался, но он также не вызывался.

Для любопытных, приложение является собственным хостом обмена сообщениями Chrome и запускается программно. И он может быть закрыт для меня, если канал закрывается, поэтому мне действительно нужно какое-то событие или уведомление или что-то, что позволит мне надежно выполнить некоторый код при завершении работы. Мое приложение должно оставаться невидимым и не должно появляться в переключателе приложений, если пользователь использует Command-Tab.

ОБНОВЛЕНИЕ:

С самого начала я заметил, что в консольное приложение записывается следующее, когда я завершаю свое приложение из Activity Monitor:

com.apple.xpc.launchd[1]: (com.allinlearning.ailhost.67908[13017]) Service exited due to signal: Terminated: 15

Это напрямую связано с ответом Питера Хоси на этот SO вопрос: applicationWillTerminate не вызывается. Поэтому я немедленно добавил ключ NSSupportsSuddenTermination в свой Info.plist, чтобы отключить внезапное завершение, надеясь (как предполагает ответ Питера), что applicationWillTerminate будет предоставлено время для запуска. Увы, это не так. Но, возможно, это проясняет ситуацию. Если действительно этот консольный оператор означает, что мое приложение закрывается, то как я могу получить шанс выполнить некоторый код до конца?

0 ответов

Другие вопросы по тегам