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

ken*_*nyc 5 cocoa xpc foundation appkit nsxpcconnection

我已经成功地遵循了守护进程和服务指南 - 创建XPC服务教程,以及SandboxedFetch示例代码,并且使用了新NSXPCConnection类的工作客户端/服务设置.

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

由于服务是轻量级的,非nibbed,NSApplication我试图通过invalidate从内部调用来自我终止它applicationWillTerminate,但几乎每次都会触发EXC_BAD_ACCESS异常.调用invalidate该服务可以[NSXPCListener serviceListener]产生稍微不那么可靠的崩溃,但它仍然会崩溃.

invalidate从客户端应用程序内部调用NSXPCConnection也几乎每次都会生成一个EXC_BAD_ACCESS异常.

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

附件是一个例外的堆栈跟踪之一的小屏幕截图.(是的,这是在服务中加载的webview.一旦webview完成加载,我希望服务自行终止)

在此输入图像描述

Int*_*oet 2

我的第一反应是你不应该费心终止。当出现内存压力并且您的服务空闲时,launchd 将终止您的服务。退出可能不符合任何人的最佳利益,因为您的服务需要时间才能再次启动。不要终止,您就不必找出尝试崩溃的原因。

但如果由于某种原因您决定终止,请不要那么努力。只要做任何你需要做的事情来清理(刷新缓冲区,优雅地关闭网络连接,这样服务器就不会受到影响,等等)并调用退出。尽管您似乎正在使用 NSApplication,但您的服务在任何意义上都不是用户关心的应用程序,并且没有令人信服的理由在这方面表现得像一个应用程序。无论如何,主机应用程序都需要能够应对您的服务崩溃,因此您故意毫不客气地退出就可以了。

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