我的父应用程序使用帮助程序XPC来完成某项任务T1。 XPC服务使用NSXPCConnection实现。 一旦任务完成,我不需要这个XPC活着。因此,父进程在NSXPCConnection对象上调用invalidate。 但是,即使连接无效,XPC仍然存在。我可以看到它被列在Activity Monitor中。
当父应用程序仍在运行且不需要XPC活着时,如何终止此XPC?
答案 0 :(得分:0)
XPC Agent的设计意味着长寿。 它们在根据.plist配置中的KeepAlive设置退出或崩溃时自动重新加载。
也许您可以注册为NSWorkspace事件的观察者:
[[NSWorkspace sharedWorkspace] notificationCenter];
请参阅: NSWorkspace 工作区通知在以下时间发布:
然后,当您的父应用程序退出并在启动时重新启用它时,您可以禁用您的XPC服务。
答案 1 :(得分:0)
为了清楚起见,当父应用程序退出时,您的XPC进程将退出。我的确如此。你的问题是:如何在此之前杀死它?
这很简单:只需在调用完成处理程序后立即在XPC进程中调用exit(0)
,该处理程序将输出发送回父应用程序。上个月,我需要在一个项目中执行此操作,因为XPC进程使用的是Apple私有框架,并且退出它是我想要阻止某个不受欢迎和无法解释的唯一方法(因为我有没有关于私人框架的文件)副作用。
所以,一个后续问题是:你是否应该因为你想变得好而杀了它?我认为答案是没有,根据以下引用来自Apple的Daemons and Services Programming Guide > Creating XPC Services
XPC服务由launchd管理,按需启动它们, 如果它们崩溃则重新启动它们并终止它们(通过发送SIGKILL) 当他们闲着时。
总结:完成后只需使连接无效,让launchd担心查杀。另外,不要屏住呼吸。我的应用程序运行了两个小时,而XPC进程,最后一次连接在两小时前关闭,仍在运行。