2

アプリの終了時に applicationWillTerminate:(NSNotification *) ハンドラーが呼び出されない Mac アプリがあります。プログラムがシャットダウンされた場合に呼び出さなければならない C++ メモリ クリーンアップ コードがいくつかあるので、これを行う何らかの方法が必要です。

呼び出されない理由は、次のキーを Info.plist に追加したことに関連しているようです。

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

このトピックに関する他の質問と回答を読みました。たとえば、applicationWillTerminate: not being calledおよびapplicationWillTerminate not called (受け入れられた正解は機能しませんでした)。applicationDidEnterBackground() も起動されません。applicationDidFinishLaunching() は常に正常に起動します。applicationShouldTerminate() が呼び出されたことがある場合は NSTerminateNow を返しますが、どちらも呼び出されません。

興味深いことに、このアプリは Chrome ネイティブのメッセージング ホストであり、プログラムによって起動されます。また、パイプが閉じるとシャットダウンされる可能性があるため、何らかのイベントや通知、またはシャットダウン時にコードを確実に実行できるものが本当に必要です。ユーザーが Command-Tab を使用する場合、アプリは非表示のままにする必要があり、アプリケーション スイッチャーに表示する必要はありません。

更新

アクティビティ モニターからアプリを終了すると、コンソール アプリに次のログが記録されることに最初から気付きました。

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

これは、この SO の質問に対する Peter Hosey の回答に直接関連しています: applicationWillTerminate does not get invoked。そのため、すぐに NSSupportsSuddenTermination キーを Info.plist に追加して突然の終了を無効にし、(Peter の回答が示すように) applicationWillTerminate に起動する時間が与えられることを期待しました。残念ながら、そうではありませんでした。しかし、それはおそらく物事を明確にします。実際にそのコンソール ステートメントがアプリが終了していることを意味している場合、The End の前にコードを実行する機会を得るにはどうすればよいでしょうか?

4

0 に答える 0