插件开发 - 将自定义框架嵌入到 XPC
Plugin Development - Embedding Custom Framework to XPC
我最近创建了一个自定义框架,计划将其重新用于多个项目。问题是,这是一个插件,并且知道我们不能简单地将框架嵌入到插件的包中,由于符号冲突和其他问题,我正在考虑将它简单地嵌入到插件的 XPC 中。在旁注中,这个框架将用于启动自定义界面,例如视图控制器、视图,并使用其中的一些委托,插件将必须获得所有权(我希望如此)。这让我想到了我的问题:是否有可能让不同的进程获得 XPC 中实例化的对象的所有权?我对使用框架还很陌生,所以我花了几个小时试图根据我在网上找到的教程在 XCode 中拼凑一些东西,遗憾的是没有用。
一个框架是一组代码和资源,可以被多个应用程序使用和重用。它可以嵌入到您的应用程序中,成为操作系统的一部分(整个 Cocoa 实际上是框架的集合),或者动态定位并在运行时以编程方式加载。加载后,框架的代码 类 和资源对应用程序来说就好像它们已直接编译到主机应用程序中一样。关键是代码直接在你进程的内存中执行 space.
XPC 是一个 inter-process 通信设施。它允许一个进程用不同的进程发送和接收消息。它不能用于与自身通信。
您不能 "take ownership" 使用 XPC 的对象。所有 XPC 消息序列化("archive" in Cocoa-speak)任何对象,并在接收端 de-serialize 该对象。第二个过程现在如何复制原始对象;它不是对原始对象的引用,并且受限于其进程的边界。
如果你的第二个进程需要显示一些东西,你有(基本上)三个选项:
(1) 使第二个进程成为自己的应用程序。第二个进程可以是 full-fledged Cocoa 应用 windows 等等。您可以将其设为 "accessory" 应用程序,这样它就没有菜单栏或出现在停靠栏中。请参阅 LSUIPresentationMode
Info.plist 属性 and/or NSApplication.activationPolicy
。
(2) 高级技巧是使用IOSurface
。 IOSurface
本质上是一种方法,第二个进程(您的 XPC 服务)可以通过该方法直接绘制到您的应用程序的 window 中。同样,绘图对象仍然存在——并且在第二个过程中完全隔离;但是它们绘制的内容将出现在您的应用程序中,就好像它们是本地视图对象一样。 (这就是 Safari 的工作方式;每个浏览器页面都由绘制到表面的隔离后台进程呈现。)
(3) 使用 poor-man 的 IOSurface
:将您的数据发送到第二个进程,让它将结果渲染成某种东西(像素数组、TIFF、PNG、...)可以由主机应用程序序列化和绘制,然后使用 XPC 将渲染的图像发送回主机应用程序进行显示。
我最近创建了一个自定义框架,计划将其重新用于多个项目。问题是,这是一个插件,并且知道我们不能简单地将框架嵌入到插件的包中,由于符号冲突和其他问题,我正在考虑将它简单地嵌入到插件的 XPC 中。在旁注中,这个框架将用于启动自定义界面,例如视图控制器、视图,并使用其中的一些委托,插件将必须获得所有权(我希望如此)。这让我想到了我的问题:是否有可能让不同的进程获得 XPC 中实例化的对象的所有权?我对使用框架还很陌生,所以我花了几个小时试图根据我在网上找到的教程在 XCode 中拼凑一些东西,遗憾的是没有用。
一个框架是一组代码和资源,可以被多个应用程序使用和重用。它可以嵌入到您的应用程序中,成为操作系统的一部分(整个 Cocoa 实际上是框架的集合),或者动态定位并在运行时以编程方式加载。加载后,框架的代码 类 和资源对应用程序来说就好像它们已直接编译到主机应用程序中一样。关键是代码直接在你进程的内存中执行 space.
XPC 是一个 inter-process 通信设施。它允许一个进程用不同的进程发送和接收消息。它不能用于与自身通信。
您不能 "take ownership" 使用 XPC 的对象。所有 XPC 消息序列化("archive" in Cocoa-speak)任何对象,并在接收端 de-serialize 该对象。第二个过程现在如何复制原始对象;它不是对原始对象的引用,并且受限于其进程的边界。
如果你的第二个进程需要显示一些东西,你有(基本上)三个选项:
(1) 使第二个进程成为自己的应用程序。第二个进程可以是 full-fledged Cocoa 应用 windows 等等。您可以将其设为 "accessory" 应用程序,这样它就没有菜单栏或出现在停靠栏中。请参阅 LSUIPresentationMode
Info.plist 属性 and/or NSApplication.activationPolicy
。
(2) 高级技巧是使用IOSurface
。 IOSurface
本质上是一种方法,第二个进程(您的 XPC 服务)可以通过该方法直接绘制到您的应用程序的 window 中。同样,绘图对象仍然存在——并且在第二个过程中完全隔离;但是它们绘制的内容将出现在您的应用程序中,就好像它们是本地视图对象一样。 (这就是 Safari 的工作方式;每个浏览器页面都由绘制到表面的隔离后台进程呈现。)
(3) 使用 poor-man 的 IOSurface
:将您的数据发送到第二个进程,让它将结果渲染成某种东西(像素数组、TIFF、PNG、...)可以由主机应用程序序列化和绘制,然后使用 XPC 将渲染的图像发送回主机应用程序进行显示。