如何终止/重置捆绑 XPC 帮助程序?

Bob*_*ols 5 macos xpc

有谁知道如何终止或重置 XPC 助手?根据 Apple 文档,launchd 会在 XPC 助手崩溃时对其进行处理。但是,如果您需要中断或取消正在运行的助手,则没有指示该怎么做。

例如,如果我有一个正在渲染 32 位 QuickTime 影片的 XPC 客户端,我如何让我的 64 位“父”应用程序向 XPC 助手发出信号以取消作业并进行清理?

另外,XPC 帮助程序应用程序处理“退出”的父级的正确方法是什么?

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

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

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

提前致谢!

Tom*_*m E 2

您的问题似乎并不要求正确处理助手的任何崩溃。相反,您似乎只需要一种方法来正确地告诉助手终止自身。如果这是正确的,请继续阅读以获取解决方案。至少如果你在询问三年后仍然需要一个\xe2\x80\xa6

\n

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

\n

作为“NSXPCConnection”的一部分,您必须定义一个协议,用于应用程序和助手之间的信息共享。在此协议中,您可以添加一个简单的函数,如下所示:

\n
terminateHelper(withReply reply: (String) -> Void) {\n    reply("Terminating Helper.")\n    exit(0)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

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


请注意,这launchd将立即重新启动已终止的帮助程序应用程序,尽管它并未\xe2\x80\x99t 崩溃,而是被正常终止。但是,这将保证帮助程序返回到初始化状态,并且所有先前的帮助程序处理都会停止。

\n

如果您暂停或使您提出问题的方式无效,那么您只是取消了 XPC 连接。但是,无论是暂停连接还是使连接无效,都不会向帮助程序发送任何类型的消息。助手本身只会看到连接被挂起或失效,而不知道任何原因。

\n

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

\n