自动终止MacOS XPC服务的正确方法是什么?

时间:2014-04-21 18:09:17

标签: cocoa appkit foundation xpc nsxpcconnection

我已成功完成Daemons and Service Guide - Creating XPC Services教程以及SandboxedFetch示例代码,并且正在使用新的NSXPCConnection类进行客户端/服务设置。

对我来说,完全清楚的是如何在服务应用程序完成其工作后正确地自行终止服务应用程序。我认识到,在许多情况下,服务预计仍然存在,但在我想到的用例中,该服务将仅用于进行一些我不会在主应用程序中执行的处理。一旦完成该处理,就没有理由保留服务应用程序。如果客户端稍后需要其他服务,则可以重新创建一个新服务。

由于该服务是轻量级的,非nibbed NSApplication,我试图通过从invalidate内部调用applicationWillTerminate来自行终止它,但这几乎触发了EXC_BAD_ACCESS异常每次。在服务invalidate上调用[NSXPCListener serviceListener]会导致可靠性稍差的崩溃,但仍然会崩溃。

invalidate上的客户端应用程序中调用NSXPCConnection几乎每次都会生成一个EXC_BAD_ACCESS异常。

所以我很好奇正确的步骤顺序是干净地关闭XPC服务然后退出服务应用程序。理想情况下,服务在向客户端发出最后一次XPC调用后会自行终止。

附件是一个关于异常堆栈跟踪之一的简短截图。 (是的,这是在服务中加载的webview。一旦webview加载完毕,我希望服务自行终止)

enter image description here

1 个答案:

答案 0 :(得分:0)

我的第一反应是你不应该费心去终止。当发生内存压力且您的服务处于空闲状态时,launchd将终止您的服务。退出可能不符合任何人的最佳利益,因为您的服务需要时间再次启动。不要终止,你不必弄清楚你的尝试崩溃的原因。

但如果由于某种原因你决定终止,不要那么努力。只需做你需要做的任何事情来清理(刷新缓冲区,优雅地关闭网络连接,这样服务器就不会受到影响),然后调用exit。虽然您似乎正在使用NSApplication,但您的服务并不是用户关心的任何意义上的应用程序,并且没有令人信服的理由在这方面采取行动。主机应用程序需要能够应对你的服务崩溃,所以你故意不刻意退出就好了。

顺便说一句,在XPC服务中使用NSApplication可能不是最好的主意,因为没有支持的方式来声明你想要它。这可能有助于解释为什么它不能像你想的那样工作,尽管这段不应被解释为对崩溃的正确分析。 : - )