gpt4 book ai didi

objective-c - Mac OS X XPC 作为两个应用程序之间的 IPC

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:59 37 4
gpt4 key购买 nike

我有一个有窗口的应用程序和无窗口的助手,位于应用程序包内,并作为登录项工作。应用程序可以启动和停止助手,一切都在那里。问题是我需要在它们之间创建一些双向通信 channel 。它应该适用于沙盒和非沙盒版本,最好是在 OS X 10.7+ 中。
我调查了这个主题,发现 XPC 可以提供点对点连接。我已阅读相关的 Apple 文档以及以下几个主题:

Is possible to use Mac OS X XPC like IPC to exchange messages between processes? How?
Communicate with another app using XPC
http://afewguyscoding.com/2012/07/ipc-easy-introducing-xpc-nsxpcconnection/
https://www.objc.io/issues/14-mac/xpc/

但是我找不到关于应该如何组织我的 XCode 项目的任何描述。我有两个目标:“Main App”和“Helper App”。现在我需要添加第三个,以XPC Service为模板。好的,但接下来要做什么?这个 XPC bundle 应该放在哪里才能同时用于两个应用程序?请注意,该助手位于主应用程序包中,因为它是一个登录项。所以,我需要一些明确的说明或只是一个 XCode 项目示例。

谢谢,亚历克斯

最佳答案

好吧,对于一直为此苦苦挣扎的任何人,我终于能够使用 NSXPCConnection

100% 地在两个应用程序进程之间进行通信

要注意的关键是您只能为三件事创建 NSXPCConnection

  1. XPCService。您可以通过以下方式严格连接到 XPCService一个名字
  2. Mach 服务。您还可以连接到 Mach 服务严格通过名字
  3. NSXPCEndpoint。这就是我们寻找,在两个应用程序进程之间进行通信。

问题在于我们无法将 NSXPCEndpoint 从一个应用程序直接传输到另一个应用程序。

它涉及创建一个包含 NSXPCEndpoint 属性的 machservice Launch Agent ( See this example for how to do that)。一个应用程序可以连接到 machservice,并将该属性设置为其自己的 [NSXPCListener anonymousListener].endpoint

然后其他应用程序可以连接到 machservice,并请求该端点。

然后使用该端点,可以创建一个 NSXPCConnection,这成功地在两个应用程序之间建立了一个桥梁。我已经测试了来回发送对象,一切都按预期工作。

请注意,如果您的应用程序是沙箱化的,您必须创建一个XPCService,作为您的应用程序和 Machservice 之间的中间人

我很高兴我得到了这个工作——我在 SO 方面相当活跃,所以如果有人对源代码感兴趣,只需添加评论,我可以通过努力发布更多详细信息

我遇到的一些障碍:

你必须启动你的 machservice,这些是行:

   OSStatus                    err;
AuthorizationExternalForm extForm;

err = AuthorizationCreate(NULL, NULL, 0, &self->_authRef);
if (err == errAuthorizationSuccess) {
NSLog(@"SUCCESS AUTHORIZING DAEMON");
}
assert(err == errAuthorizationSuccess);

Boolean success;
CFErrorRef error;

success = SMJobBless(
kSMDomainSystemLaunchd,
CFSTR("DAEMON IDENTIFIER HERE"),
self->_authRef,
&error
);

此外,每次重建守护进程时,您都必须使用以下 bash 命令卸载以前的启动代理:

sudo launchctl unload /Library/LaunchDaemons/com.example.apple-samplecode.EBAS.HelperTool.plist
sudo rm /Library/LaunchDaemons/com.example.apple-samplecode.EBAS.HelperTool.plist
sudo rm /Library/PrivilegedHelperTools/com.example.apple-samplecode.EBAS.HelperTool

(当然还有你相应的标识符)

关于objective-c - Mac OS X XPC 作为两个应用程序之间的 IPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41780750/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com