问题标签 [nsxpcconnection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1808 浏览

cocoa - 自行终止 MacOS XPC 服务的正确方法是什么?

我已经成功地遵循了守护进程和服务指南 - 创建 XPC 服务教程,以及SandboxedFetch示例代码,并且有一个使用新NSXPCConnection类的有效客户端/服务设置。

我仍然不完全清楚的是,一旦服务应用程序完成其工作,如何正确地自行终止它。我认识到,在许多情况下,该服务有望保持活动状态,但在我想到的用例中,该服务将用于仅执行一些我不会在主应用程序中执行的处理。一旦该处理完成,服务应用程序就没有理由保留。如果客户以后需要另一项服务,它可以重新创建一个新服务。

由于该服务是轻量级的、非 nibbed 的NSApplication,我试图通过invalidate从 inside 调用来自行终止它applicationWillTerminate,但这几乎每次都会触发 EXC_BAD_ACCESS 异常。调用invalidate该服务会[NSXPCListener serviceListener]产生稍微不太可靠的崩溃,但它仍然会崩溃。

invalidate从客户端应用程序内部调用它NSXPCConnection也几乎每次都会生成一个 EXC_BAD_ACCESS 异常。

所以我很好奇正确的步骤顺序是干净地关闭 XPC 服务然后退出服务应用程序。理想情况下,服务会在对客户端进行最后一次 XPC 调用后自行终止。

附件是一个异常堆栈跟踪的小屏幕截图。(是的,这是在服务中加载的 webview。一旦 webview 完成加载,我希望服务自行终止)

在此处输入图像描述

0 投票
1 回答
108 浏览

objective-c - 在 32 位和 64 位可可应用程序之间传递数据

我有一个需要使用 32 位渲染库的 64 位可可项目,我无法将其移植到 64 位。

我决定将其分离为渲染服务,它将以 32 位编译并为库提供接口,而主项目将以 64 位编译并访问渲染服务。

我想知道进行进程间通信的最佳方式是什么。我正在寻找一种能够提供快速通信和简单 api 的解决方案。

现在看来,XPC(特别是 NSXPCConnection)是推荐的解决方案。但是,我不确定 - 它是为 32 位应用程序实现的吗?

另外,我需要传递相当大量的数据(最大约 5MB),所以我担心 XPC 的性能和速度。在这种情况下是否可以/推荐共享内存映射?它可以与xpc一起使用吗?

0 投票
2 回答
425 浏览

macos - 从 NSXPCConnection 传递非空参数时未调用应用程序回复

我正在使用 XPC 将一个项目分成两个项目 - 一个为 os x @ 64 位构建的主项目,以及一个为 os x @ 32 位构建的 XPC 服务,因为它使用的库不适用于32位,无法更换。两者使用 NSXPCConnection 进行通信。

我从服务到主应用程序的回调有一个问题:
当回复采用复杂的参数(即:作为 nsimage 或 nsdata 的类)时,它是否不会从 xpc 服务回调。没有错误或异常,只是没有任何反应。这有时也会以另一种方式发生,即在调用代理对象时。它不是随机发生的,它只发生在某些回复签名中,尽管我不确定是哪个。

我需要在 xpc 服务和主应用程序之间以某种方式传递 nsimage。我尝试同时传递 NSImage 和 NSData,但没有调用回复(值得一提 - 当传递 nil 而不是真实对象时调用它)。

我尝试使用 [NSData bytes] 发送指针,然后使用 [NSData initWithData:length:] 重新创建数据。当我尝试此操作时,会调用回复,但在调用 initWithData 时会收到 EXC_BAD_ACCESS。我认为这是因为 32 位和 64 位寻址之间存在一些混乱。

一些代码示例:

当回复采用 nsimage 时:

导出界面

回复来自

当回复将 ptr 指向数据时:

导出界面

回复来自:

0 投票
1 回答
1001 浏览

objective-c - 应该如何编写带状态的 XPC 服务?

我已经阅读了 NSXPC* 文档,该文档建议使出售的服务尽可能无状态。这是一个好主意,至少对于我读过的文档和示例而言,因为服务和调用应用程序将彼此视为单例,并且一次只运行一个服务实例。这意味着这些方法本质上是非成员函数(使用 C++ 术语)。

我为什么要解决这个问题?我想将网络代码放入 XPC。由于 XPC 将使用具有多个窗口的 GUI 应用程序,因此我需要支持多个同时连接。这不适用于单身人士,至少直接如此。

网络 API 是基于 C 的,主要状态类型是指向自定义struct. 那么我们为什么不做类似的事情:

  1. 让创建函数返回一个值类型,比如NSUUID什么。(跨进程传递指针是个坏主意。)
  2. 在服务中,在 API C 指针和 API C 指针之间创建NSDictionarystd::map或其他)映射。NSUUID
  3. 各种服务 API 获取UUID并将其转换为 C 指针以使用网络 API。

另外:由于token是随机的,如果XPC服务崩溃,XPC重启后主应用会有一个无用的token。也许我应该使用一个 URL(它将包含所有重新启动的信息)。但是,如果两个连接碰巧在同一台服务器上,我们就会遇到潜在的冲突。也许我可以将这些想法与作为 URL/UUID 对的令牌结合起来。(UUID 值将从服务返回变为由主应用程序提供。)

这是实现全状态 XPC 的好方法吗?

0 投票
0 回答
265 浏览

objective-c - 未使用 NSValue 的 NSArray 作为参数调用 XPC 方法

我有一个为 OS-X 编译 32 位的 XPC 服务。它的一种方法将单个参数作为参数,并在主进程上调用给定的块。

这个块需要 3 个 NSStrings 和一个应该只包含 NSValues 的 NSArray。每个 NSValue 对象都持有一个 NSRect。

由于某种原因,当 NSArray 不为零时,不会调用给定的块。如果不是保存 NSValues,而是让数组保存 NSStrings,则该块被正确调用。

我不确定如何解决这个问题,因为没有明显的原因会发生这种情况。根据苹果文档,NSValue 确实符合 NSSecureCoding。

我什至尝试使用以下方法将 NSValue 类列入白名单(这实际上并不需要):

这似乎没有任何改变。

知道如何通过 NSArray 吗?我想我可以将所有 NSRects 格式化为 NSStrings,并传递一个我知道可行的 NSStrings 数组,但这会导致我宁愿避免的性能下降。

0 投票
1 回答
699 浏览

macos - 使用 NSXPCListener 执行常规任务的帮助应用程序

我的助手代理应用程序需要在启动后不断执行一项活动,但它还需要通过 XPC 与主应用程序进行通信

但是,监听器的设置需要一个特定的 main 函数,并接管应用程序(省略标准的 AppDelegate NSApplication 方法)

如何两者兼得?带有 NSRunLoop 和 NSXPCListener 应用程序的后台应用程序?

0 投票
1 回答
1645 浏览

objective-c - XPCService 未从应用程序启动

我正在尝试一个简单的示例应用程序XPCServices,其中我遵循以下步骤:

第 1 步:创建一个示例项目并向其中添加目标(XPCServices带有名称)HelperProcess。创建目标时,XCode 会自动生成以下文件:

  1. HelperProcessProtocol.h
  2. HelperProcess.h
  3. HelperProcess.m
  4. 主文件

第2步:main.m实现中添加了一条日志语句ServiceDelegate

第3步:AppDelegate添加下面的代码applicationDidFinishLaunching:

问题是——

当我启动应用程序时,既不会显示在 listener:shouldAcceptNewConnection: 中添加的日志,也不会在 Activity Monitor 中显示 helper 进程:(

这是代码:XPCShootOut

注意:我在 XCode 6.0 上尝试这个

是否需要进行任何其他设置才能使其正常工作?请建议。

- 更新 -

我试图从苹果引用这个示例:AppSandboxLoginItemXPCDemo

当我尝试在 XCode 6 上运行它时,它显示错误消息 - '未找到签名身份'。由于我没有注册 mac 开发人员帐户,因此在 iDecide 和 iDecideHelper 的构建设置中,我将“代码签名身份”更改为“不进行代码签名”。

我收到了每个目标的警告:

这次当我编译构建时,它按预期工作。

现在我尝试按照其 ReadMe.txt 文件中指定的步骤进行操作,特别是我在示例应用程序中执行了这些步骤:

第 1 步:更新 - 主应用程序目标 -> 功能选项卡

  1. 打开“应用沙盒”
  2. 打开“应用程序组”
  3. 添加了一个应用组 - 'XYZ'

第 2 步:更新 - 助手目标 -> 功能选项卡

  1. 打开“应用沙盒”
  2. 启用“传出连接(客户端)”
  3. 打开“应用程序组”
  4. 添加了一个应用组 - 'XYZ'

第 3 步:更新 - Helper Target -> General Tab -> Bundle Identifier,添加“XYZ”前缀。

在控制台中运行应用程序时,它会显示以下消息:

应用程序都没有执行其预期功能,也没有显示在listener:shouldAcceptNewConnection:委托中添加的日志消息。

我一无所知。请建议我是否缺少任何东西?是否可以在没有注册 mac 开发者帐户的情况下使 XPC 服务示例应用程序正常工作?

0 投票
1 回答
285 浏览

objective-c - NSWorkspace runningApplications 不返回我的 XPC mach 服务

返回正在运行的应用程序和代理,但我看不到我正在运行的 XPC mach 服务(尽管它正在运行并且在活动监视器进程中可见)

即使我在活动监视器中查找 PID

我得到 res nil,虽然在其他进程中这很好用

0 投票
2 回答
493 浏览

objective-c - 助手应用沙盒和安全范围的书签

所以我一直在用这个扯掉我的头发......

我有一个主应用程序和一个辅助应用程序。两者都是沙盒并使用应用程序组共享数据。我通过 NSXPCConnection 与助手应用程序交谈。我使用SMLoginItemSetEnabled将帮助应用程序设置为登录项。当用户激活助手应用程序时,它会作为守护程序运行。

这一切都很好。问题在于安全范围的书签。

帮助应用程序需要访问系统文件。当我需要授予对新位置的访问权限时,这是由主应用程序完成的,通过 NSXPCConnection 打开帮助程序并使用此类打开 NSOpenPanel:(https://github.com/leighmcculloch/AppSandboxFileAccess)这一切似乎工作也......

该类告诉我已授予文件访问权限,但是我还在控制台中收到了沙盒违规。

我在帮助应用程序中有正确的权利:

我还读到有人在访问后台线程上的书签时遇到问题,所以我尝试将所有与书签相关的调用包装在:

仍然没有喜悦。任何帮助深表感谢。

**沙盒是真正的噩梦......我的应用程序所做的只是在没有用户干预的情况下删除一些系统文件。沙盒之前这么简单的任务....现在我需要处理loginItems,XPC....很多令人头疼的问题。:(

0 投票
2 回答
5262 浏览

objective-c - 打开 NSOpenPanel 时获取插件 com.getdropbox.dropbox.garcon 中断

当我打开 NSOpenPanel 然后我的应用程序崩溃时,我在控制台上收到此消息:

在调试器中,我收到关于 Thread 6 的警告说:

我尝试了一切打开我的 NSOpenPannel[openPanel runModal][openPanel beginSheetModalForWindow:...

我使用 NSOpenPanel 只是为了打开一个 txt 文件

我该怎么做才能停止收到此消息并且应用程序停止崩溃?

该应用程序未经过沙盒处理和代码签名。我只是在 Debug-build 中尝试,因为我没有苹果开发者帐户。Mac OS X 版本为 10.10,Dropbox 版本为 3.0.3