如何终止/重置捆绑XPC助手?

时间:2014-10-22 11:02:19

标签: macos xpc

有谁知道如何终止或重置XPC助手? 根据Apple文档,如果它崩溃,launchd会处理XPC帮助程序。但是,如果您需要中断或取消正在运行的助手,则无法说明该怎么做。

例如,如果我有一个正在渲染32位QuickTime影片的XPC客户端,我如何获得我的64位"父母"应用程序发信号通知XPC帮助程序取消作业并清理?

此外,XPC帮助应用程序处理具有"退出"?

的父级的正确方法是什么?

目前,要在父应用程序端终止,我正在使用(NSXPCConnection):

  • (无效)暂停
  • (无效)无效

这些似乎关闭了连接。但我没有看到帮助应用正在关注的任何证据。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您的问题似乎没有要求正确处理帮助程序的任何崩溃。相反,您似乎只需要一种方法来正确告诉帮助程序自行终止。如果这是正确的,那么请继续阅读以获得解决方案。至少如果你在问完后还需要三年......

您没有指定要使用的语言,因此请注意我的示例是用Swift编写的。

作为NSXPCConnection的一部分,您必须定义一个协议,用于在app和helper之间共享信息。在此协议中,您可以添加一个带签名和内容的简单函数:

terminateHelper(withReply reply: (String) -> Void) {
    reply("Terminating BeKo Helper.")
    exit(0)
}

此函数使用提供的闭包将消息字符串报告回主应用程序,然后使用exit系统调用终止自身。

从您的主应用程序中,您可以像这样调用此函数:

if let helper = helperConnection.remoteObjectProxyWithErrorHandler({ (error) in
    let e = error as NSError
    print("Helper communication failed. Remote proxy error \(e.code): \(e.localizedDescription) \(e.localizedRecoverySuggestion ?? "---")")
}) as? HelperProtocol {
    helper.terminateHelper(withReply: { (replyString) in
        print(replyString)
    })
}


请不要launchd将立即重新启动已终止的帮助应用程序,尽管它没有崩溃但是优雅地终止了。但是,这将保证帮助程序返回初始化状态,并停止所有先前的帮助程序处理。

如果您暂停或无效放入问题的方式,则只取消XPC连接。但是暂停不使连接无效也不会向帮助者发送任何类型的消息。帮助器本身只会看到连接被挂起或无效,而不知道原因。

希望这至少让您了解如何处理问题。