问题标签 [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 回答
1382 浏览

macos - XPC 在工作空间中的两个可可应用程序之间,NSXPCConnection 立即失效

我有两个 Cocoa 应用程序,在这个 XPC 关系中,一个将是发送者,另一个是接收者。

applicationDidFinishLaunchingsender中,我先打开第二个receiver应用

然后我创建我的NSXPCConnection

然后我尝试通过连接发送消息(连接已经在这里失效)

这是我的接收器应用程序的应用程序委托:

这是proxyError我尝试通过连接发送消息的时间:

错误域 = NSCocoaErrorDomain 代码 = 4099 “与名为 com.TechSmith.TestXPCHelper 的服务的连接已失效。” UserInfo={NSDebugDescription=与名为 com.TechSmith.TestXPCHelper 的服务的连接无效。}

所以我认为我对NSXPCConnection. 我找不到两个应用程序相互通信的好例子——它总是一个应用程序和一个服务。这就是我的问题吗?我需要在应用程序之间提供服务吗?

有什么方法可以获取有关此连接为何无效的更多信息?这也会有很大帮助

0 投票
1 回答
1387 浏览

xcode - 在 XPC 协议中使用自定义类

我正在尝试在withReply签名上使用我自己的类型编写 XPC 服务。类型/类具有 Xcode 的主应用程序和 XPC 服务的“目标成员资格”。但是incompatible reply block signature,即使withReply签名中使用了相同的类,我也会进入调试输出,但是 Xcode 目标不同,我将在下面解释。

注意:这是在 Swift 中使用这个项目来完成的。除了那里他们使用NSData而不是自定义类型。

细节

出于这个问题的目的,我将使用以下示例

  • 自定义类 - Tweet- 该类符合NSSecureCoding协议,以便在主应用程序和 XPC 服务之间传递
  • XPC 协议 -TweetTransfer需要一种方法func take(_ count: Int, withReply: ((Tweet) -> Void))

然后是我导出符合TweetTransfer. XPC 服务似乎已启动,但随后在它与主应用程序之间传输失败并出现

完整的消息如下[1],但“wire”和“local”之间的唯一区别是参数一是

  • 金属丝 -_TtC17MainApp5Tweet
  • 当地的 -_TtC23XPCWorker5Tweet

Xcode 目标不同的地方。这足以扔掉它吗?那么我如何在应用程序和它的 XPC 服务之间共享代码呢?

[1] 完整的错误文本

更新

有关协议、remoteObjectProxy 连接和 Tweet 对象的更多信息。这是用于 XPC 调用的协议:

为方便起见,我使用了类型别名。然后Tweet对象非常简单,仅用于测试(虽然支持 NSSecureCoding 有点复杂):

最后是我们调用 remoteObjectProxy 的地方

0 投票
1 回答
3023 浏览

objective-c - 如何创建一个 Hello World XPC 程序?

我是Apple XPC技术的新手(实际上我也是Objective-C的新手),最近我想学习一些关于XPC技术的知识,它用于在进程之间进行通信。有人知道如何使用 XCode 将命令行 hello world 程序与 XPC 程序结合起来吗?我所做的是:1)创建一个命令行“HelloWorld”项目;2)在项目'HelloWorld'项目下创建一个'target';3)然后我不知道如何将它们组合在一起;(也许在构建设置中设置了一些东西?)如果你能告诉我如何做到这一点,那将非常有帮助。谢谢。

我的操作系统是 10.12,xcode 是 8.2。

0 投票
1 回答
331 浏览

objective-c - XPC 服务:提高工作线程上的堆栈大小

背景背景:

我有一个为 macOS 10.11+ 构建的应用程序。这个应用程序需要运行一些可能偶尔崩溃的第三方代码(Libsass 编译器)。为了避免关闭我的整个应用程序,我创建了一个NSXPCConnection运行此代码的 XPC 服务(使用 Xcode 中的标准 XPC 服务模板)。


我的问题:

XPC 服务似乎将运行我的代码的线程的堆栈大小设置为,这是除主线程之外的线程512kb的 macOS 默认值。(默认情况下,主线程的堆栈大小。)8MB

Libsass 编译器有时会在某些涉及深度递归的文件(以及许多堆栈帧)上发生堆栈溢出而崩溃。

注意:我知道这是问题所在,因为如果我在我的应用程序的主线程上运行完全相同的Libsass 序列(不使用 XPC),一切正常,堆栈溢出永远不会发生。


我需要的:

一种增加 XPC 服务执行工作的线程堆栈大小的方法。


我试过的:

我已经-Wl,-stack_size,4000000为我的 XPC 服务目标添加了“其他链接器标志”构建设置。这会将堆栈大小设置为 64MB(允许的最大值)。构建后,我在 Finder 中检查 XPC 包,并使用以下命令验证链接器是否正确应用了此标志:

这会产生此输出:stacksize 67108864,表明堆栈大小确实已设置为64MB

问题是这仅适用于服务的线程,而我的 XPC 方法似乎没有在服务的主线程上调用。我通过 using 验证了这一点,它在我的 XPC 方法中调用时[NSThread isMainThread]返回。false

所以,我然后尝试使用但是,仍然从该块内返回,强制在主线程上完成工作。此外,如果我使用,我得到,这表明运行此代码的线程有一个堆栈。极好的。dispatch_async(dispatch_get_main_queue() ^{...});-isMainThreadfalse[NSThread currentThread] stackSize]524288512kb

我还尝试过在运行时使用setrlimit(). 这并没有解决问题。

我读过一堆文档。XPC 服务使用哪些线程以及它们如何使用它们的细节似乎是我们不应该担心的实现细节。

0 投票
1 回答
1094 浏览

swift - Swift Privileged Helper (XPC Listener) Crashing with Illegal Instruction Error

I’ve created a Swift macOS app which uses SMJobBless to create a helper with escalated privileges. This works fine—the helper gets installed to /Library/Privileged Helper Tools and an accompanying LaunchDaemon gets created in /Library/LaunchDaemons. However, the helper is unable to start successfully. Instead, it crashes with an “Illegal instruction: 4” message.

I’ve prepared the helper to respond to XML connections by implementing the NSXPCListenerDelegate protocol. Here‘s my Helper main.swift code:

The crash occurs on the last line, listener.resume().

I tried to launch the helper app manually from the command line (which is identical to what the LaunchDaemon does) and, again, it crashes with the above error message printed to stdout. I don’t have any more ideas on how to test this for the root cause. My implementation is more than rudimentary, following Apple’s guidlines for implementing XM services. Also, the various posts on SO regarding XML services haven’t helped me in resolving this issue. Has anyone of you tried to create a privileged helper in Swift successfully? BTW, the app is not sandboxed.

For the sake of completeness, here’s the code for the HelperTool class referenced in my HelperDelegate class above:

And finally the HelperToolProtocol:

Thanks for any help!

0 投票
1 回答
2086 浏览

xcode9 - NSXPCConnection 调试中断/失效

我在 XCode 9,OSX 不是 iOS,Objective-C。

我有一个 XPC 服务可以与其他应用程序通信。XPC 服务对我来说是全新的。我已经阅读了我找到的文档和文章——我仍然需要一些帮助。

服务是这样调用的:

呼叫有效,服务完成其工作。但是 - 既然该服务有效,我想深入研究使其更加稳定(即使我现在没有遇到任何问题)。

有人可以向我解释

  1. 中断和失效之间的区别(当其中一种发生时不要明白)
  2. 如果有处理这两种情况的最佳实践
  3. 如何强制两种情况(用于调试)

谢谢你的帮助

0 投票
0 回答
251 浏览

macos - 应用程序和驻留在另一个应用程序包中的服务之间的 XPC

我有两个独特的沙盒 Cocoa 应用程序。我希望其中一个能够按需向第一个应用程序提供一些数据,但不需要首先启动第二个应用程序。为此,我正在考虑在第二个应用程序中创建一个 XPC 服务,然后从第一个应用程序中使用它。

这可能吗?如果可以启用此功能,我有权启用“应用程序组”,因为到目前为止我看到的所有示例和代码都要求将服务捆绑在调用应用程序中或要求第二个应用程序运行。我不希望启动第二个应用程序,因为可以通过查询数据库简单地获取数据,并且不需要中断用户的工作流程。

这可能吗?

在第二个应用程序中创建一个后台登录项并使用组容器通过文件进行通信会更好吗?这是非常低效的,我个人更喜欢能够在两个应用程序之间进行通信。

0 投票
1 回答
359 浏览

swift - NSSecureCoding 实现类必须在共享框架中才能与 XPC 一起使用吗?

在遵循在 Swift 中创建 XPC 服务指南并尝试传递自定义Foo类时,我发现为了使其工作,它必须位于动态库中。当它嵌入到两个目标中时,与服务的连接会因4097代码而失败。如果Foo在静态库中,也会发生同样的情况。

我似乎无法引用此要求,并猜测这是因为安全性在解码时将它们识别为不同的对象。这是真的?这方面有更具体的信息吗?

0 投票
1 回答
335 浏览

macos - 是否可以将 pyobjc 与私有的 XPC 帮助工具和 XPCInterface API 一起使用?

我相信这个问题的答案是“不”,但我将它发布给社区以防万一有人比我更成功。

我有一个特权帮助工具,客户端 Cocoa 应用程序与 NSXPCConnection 和 NSXPCInterface 一起使用。接口本身包括一个通过完成处理程序块提供返回码的方法。

在 Objective-C 中,客户端代码如下所示:

我还有一个 pyobjc / py2app Mac 应用程序需要使用这个帮助工具的功能。我已经将该工具内置到 pyobjc 应用程序包中,通过 SMJobBless 进行签名和授权,但看起来有几个问题使实际使用此 API 不受支持:

1) 似乎不支持桥接 runCommand:withReply:^ 的调用 - 如果我理解正确,块仅支持 NS* 框架方法调用而不是“自定义”(即用户定义)方法?请注意,如果这是唯一的阻塞问题,我可以制作没有返回码的方法版本,但尝试并没有成功,因为......

2)为了以Objective-C的方式使用API​​,我需要创建一个@selector对runCommand的引用:它实际上没有任何python函数实现——它只需要一个定义签名的函数对象将由动态创建的 remoteProxy 提供的功能。我没有在 python 中定义 remoteProxy 实现。这似乎不受支持 - 如果没有 python 函数,我无法通过 objc.selector() 获得选择器声明。

3) 我不确定即使我可以让 2) 工作,正式协议的构造也会按照预期的方式工作,作为 interfaceWithProtocol: 的参数,来自 python - 它需要成为原生自定义 @protocol NSXPCInterface 可以在其工厂方法中使用来创建 remoteProxy。

感谢您提供任何提示,如果您已经知道如何在 pyobjc 中执行此操作,或者根据您对它的了解,任何明确的确认这些东西是不可能的。

0 投票
1 回答
375 浏览

objective-c - 如何在 macOS 上将 MTLSharedTextureHandle 或 MTLSharedEventHandle 与 C XPC 接口一起使用?

TL;DR:你如何编码和解码一个MTLSharedTextureHandleandMTLSharedEventHandler以便它可以通过一个 XPC 连接在一个内部传输xpc_dictionary


我正在开发的一个 macOS 应用程序广泛使用 XPC 服务,并使用基于 C 的 API 实现。(即:)xpc_main, xpc_connection, xpc_dictionary...这在当时是有道理的,因为某些对象,例如IOSurfaces,不支持NSCoding/NSSecureCoding并且必须使用IOSurfaceCreateXPCObject.

在 macOS 10.14 中,Apple 引入了用于在进程之间共享金属纹理和事件的新类:MTLSharedTextureHandleMTLSharedEventHandle. 这些类支持NSSecureCoding,但它们似乎在 C-XPC 接口中没有用于编码/解码它们的对应部分。

我想我可以使用类似[NSKeyedArchiver archivedDataWithRootObject:requiringSecureCoding:error]的方法将它们转换为NSData对象,然后可以将其存储在 中xpc_dictionary,但是当我尝试这样做时,我得到以下异常:

(NSXPCCoder 是一个私有类。)

MTLSharedTextureHandle和都会发生这种情况MTLSharedEventHandle。我可以切换到使用新的NSXPCConnectionAPI,但我已经在 C 接口上构建了大量代码,所以我宁愿不必进行切换。

有没有办法将这两个类中的任何一个归档到可以存储在xpc_dictionary服务和客户端之间传输的有效负载中?