相关过程目标之间的沟通C.

时间:2018-01-31 01:04:40

标签: objective-c cocoa ipc

我正在尝试编写一个启动另一个应用程序并向其发送消息(json数据)的应用程序。

我可以通过NSTask和NSPipe启动任务,但似乎只能启动任务并在Parent中读取其输出。除此之外最好的方法是什么?即启动任务并向该任务发送消息?

Objective-C中同一台机器上相关/非相关进程之间的最佳通信方式是什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

目前macOS上的进程间通信(IPC)的黄金标准是XPC。 XPC是一种快速,可靠的服务,可以(相对)轻松地在Objective-C / Swift中进行设置和使用。连接后,您的应用程序将获得连接到服务进程中的实际对象的代理对象。在服务中运行代码所需要做的就是向代理发送消息(即[remoteService doSomething:@"with this data"] - 消息被魔术编码,发送到服务进程并执行。

需要注意的是:所有这些都很容易使用如果你创建了一个XPC服务。 XPC服务是您编译并与应用程序捆绑在一起的子程序。如果您这样做,launchd将处理启动服务,创建XPC连接以及将其连接到您的应用程序。您所要做的就是告诉XPC Services API启动您的服务并开始调用方法。

您可以在守护进程和服务编程指南Creating XPC Services部分中阅读有关创建XPC服务的所有信息。还有几个示例项目说明了这是如何完成的。

如果符合您的需求,您就可以去了。

另一方面,如果你想启动任意进程并与之建立XPC连接,事情就会变得更加复杂。实际上我花了一年的时间来解决这个问题,直到找到解决方案。 Apple没有人会直接告诉我,有办法做到这一点。我怀疑这有安全隐患,这是因为(a)为什么Apple只能轻松使用捆绑的XPC服务并命名为​​XPC服务(在launchd注册),以及(b)为什么Apple员工不会谈论其他连接方法

我的建议是研究XPC服务。如果这将解决您的问题,那么到目前为止,这是最好的解决方案。

如果您绝对必须与通过其他方式启动的任意进程(不是launchd)进行通信,那么请再次发布,我可以分享详细信息。警告:这是非常重要的,你仍然需要创建一个launchd服务,所以如果你的目标是避免这种情况,那你就不走运了。