我正在尝试编写一个启动另一个应用程序并向其发送消息(json数据)的应用程序。
我可以通过NSTask和NSPipe启动任务,但似乎只能启动任务并在Parent中读取其输出。除此之外最好的方法是什么?即启动任务并向该任务发送消息?
Objective-C中同一台机器上相关/非相关进程之间的最佳通信方式是什么?
提前致谢。
答案 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服务,所以如果你的目标是避免这种情况,那你就不走运了。