4

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

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

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

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

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

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

提前致谢!

4

1 回答 1

0

您的问题似乎没有要求正确处理助手的任何崩溃。相反,您似乎只需要一种方法来正确地告诉助手终止自身。如果这是正确的,那么请继续阅读以获得解决方案。至少如果你问了三年后还需要一个……</p>

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

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

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 连接。但是,无论是挂起还是使连接无效,都不会向助手发送任何类型的消息。助手本身将简单地看到连接被挂起或失效,而不知道任何原因。

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

于 2018-01-11T13:35:07.343 回答