我已经成功地遵循了守护进程和服务指南 - 创建 XPC 服务教程,以及SandboxedFetch
示例代码,并且有一个使用新NSXPCConnection
类的有效客户端/服务设置。
我仍然不完全清楚的是,一旦服务应用程序完成其工作,如何正确地自行终止它。我认识到,在许多情况下,该服务有望保持活动状态,但在我想到的用例中,该服务将用于仅执行一些我不会在主应用程序中执行的处理。一旦该处理完成,服务应用程序就没有理由保留。如果客户以后需要另一项服务,它可以重新创建一个新服务。
由于该服务是轻量级的、非 nibbed 的NSApplication
,我试图通过invalidate
从 inside 调用来自行终止它applicationWillTerminate
,但这几乎每次都会触发 EXC_BAD_ACCESS 异常。调用invalidate
该服务会[NSXPCListener serviceListener]
产生稍微不太可靠的崩溃,但它仍然会崩溃。
invalidate
从客户端应用程序内部调用它NSXPCConnection
也几乎每次都会生成一个 EXC_BAD_ACCESS 异常。
所以我很好奇正确的步骤顺序是干净地关闭 XPC 服务然后退出服务应用程序。理想情况下,服务会在对客户端进行最后一次 XPC 调用后自行终止。
附件是一个异常堆栈跟踪的小屏幕截图。(是的,这是在服务中加载的 webview。一旦 webview 完成加载,我希望服务自行终止)