通过 NSXPCConnection 传递 xpc_object_t

Posted

技术标签:

【中文标题】通过 NSXPCConnection 传递 xpc_object_t【英文标题】:Pass xpc_object_t through NSXPCConnection 【发布时间】:2012-12-31 15:47:01 【问题描述】:

我是 XPC 服务编程的新手,我正在尝试将在 XPC 服务中创建的 iosurface 共享给主机应用程序。我可以使用 NSXPCConnection API 设置一个简单的主机和服务,现在我想我应该使用这两种方法(在 IOSurfaceAPI.h 中找到)将 IOSurface 传递给主机:

IOSurfaceRef IOSurfaceLookupFromXPCObject(xpc_object_t xobj);
xpc_object_t IOSurfaceCreateXPCObject(IOSurfaceRef aSurface);

有没有办法可以使用 NSXPCConnection API 传递 xpc_object_t,还是应该使用 C API(如 xpc.h 中定义)?

【问题讨论】:

【参考方案1】:

好问题。 The "Daemons and Services Programming Guide" 声明 XPC 代理方法只能处理以下数据类型:

算术类型(int、char、float、double、uint64_t、NSUInteger 等) 布尔 C 字符串 仅包含上述类型的 C 结构和数组 实现 NSSecureCoding 协议的 Objective-C 对象

xpc_object_t 只是void * 的类型定义,所以它不符合任何这些标准,我看不出有任何方法可以将它包装在符合要求的东西中。 (尝试将其转换为数据,或将其转换为适当大小的 int 是行不通的。)

另一方面,在 10.8 上,xpc_object_t 也足以使用 ARC 保留/释放 Objective-C 对象,添加到 Objective-C 集合等。

尝试通过您的协议传递xpc_object_t 很容易,只是看看Apple 是否留下了未记录的漏洞。试试看!

否则,底层的 XPC API 肯定可以工作:

 xpc_object_t message = xpc_dictionary_create(NULL, NULL, 0);
 xpc_object_t xpcSurface = IOSurfaceCreateXPCObject(aSurface);
 xpc_dictionary_set_value(message, "surface", xpcSurface);
 xpc_connection_send_message(connection, message);

【讨论】:

谢谢库尔特,我尝试将 xpc_object_t 作为协议方法的参数传递,但这不起作用(运行时 SIGABRT,没有编译器错误)。可惜没有漏洞!!所以我尝试了另一种方式,但似乎将 NSXPCConnection 包装器代码与 C API 混合起来并不简单:据我所知,包装器将其 xpc_connection_t 引用隐藏在私有 ivar ( void *_xconnection ) 中。但这是另一个话题。所以,要回答我自己的问题,似乎 IOSurfaceRef 并不简单地与基金会的 Objective-C 包装器兼容.. 这就是我所期望的。我强烈建议向 Apple 提交错误 - 如果人们抱怨错误,他们更有可能修复它。 使用 ID 12942765 归档的错误。感谢 Kurt! 有来自错误报告 12942765 的任何消息吗?

以上是关于通过 NSXPCConnection 传递 xpc_object_t的主要内容,如果未能解决你的问题,请参考以下文章

从 XPC 服务创建 NSXPCConnection

混合 NSXPCConnection 和 xpc C API

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

NSXPCConnection 或 XPCKit

NSXPCConnection 调试中断/失效

macOS XPC 服务未启动