【问题标题】:Plugin Development - Embedding Custom Framework to XPC插件开发 - 将自定义框架嵌入到 XPC
【发布时间】:2019-06-04 00:33:08
【问题描述】:

我最近创建了一个自定义框架,计划重复用于多个项目。问题是,这是一个插件,并且知道我们不能简单地将框架嵌入到插件的包中,由于符号冲突等等,我正在考虑简单地将它嵌入到插件的 XPC 中。附带说明一下,该框架将用于启动自定义接口,例如视图控制器、视图,并使用在其中插入的一些委托,插件必须获得所有权(我希望如此)。这让我想到了我的问题:不同的进程是否有可能获得在 XPC 中实例化的对象的所有权?我对使用框架很陌生,所以我花了几个小时尝试根据我在网上找到的教程在 XCode 中将东西组合在一起,遗憾的是无济于事。

【问题讨论】:

    标签: xcode cocoa frameworks


    【解决方案1】:

    框架 是一组可供多个应用程序使用和重用的代码和资源。它可以嵌入到您的应用程序中,成为操作系统的一部分(整个 Cocoa 实际上是框架的集合),或者在运行时动态定位并以编程方式加载。加载后,框架的代码、类和资源对应用程序来说就像是直接编译到宿主应用程序中一样。关键是代码直接在进程的内存空间中执行。

    XPC 是一种进程间 通信工具。它允许一个进程使用不同的进程发送和接收消息。它不能用于与自身通信。

    您不能使用 XPC“获得”对象的所有权。所有 XPC 消息序列化(在 Cocoa 中是“归档”)任何对象并在接收端反序列化该对象。第二个过程现在如何复制原始对象;它不是对原始对象的引用,并且受限于其进程的边界。

    如果您的第二个进程需要显示某些内容,您(基本上)有三个选择:

    (1) 使第二个进程成为自己的应用程序。第二个进程可以是一个成熟的 Cocoa 应用程序,带有 windows 等等。您可以将其设为“附件”应用程序,因此它没有菜单栏或出现在 Dock 中。请参阅LSUIPresentationModeInfo.plist 属性和/或NSApplication.activationPolicy。

    (2) 高级技术是使用IOSurface。 IOSurface 本质上是一种方法,通过该方法,第二个进程(您的 XPC 服务)可以直接绘制到应用程序的窗口中。同样,绘图对象仍然存在——并且完全隔离在第二个过程中;但是它们绘制的内容会出现在您的应用程序中,就好像它们是本地视图对象一样。 (这就是 Safari 的工作方式;每个浏览器页面都由一个独立的后台进程渲染到一个表面中。)

    (3) 使用穷人的IOSurface:将您的数据发送到第二个进程,让它将结果渲染成可以由宿主应用程序,然后使用 XPC 将该渲染图像发送回宿主应用程序进行显示。

    Daemons and Services Programming Guide

    IOSurface

    【讨论】:

    • 嗨,詹姆斯。谢谢你的甜蜜信息!只是想澄清一下:我想要的是插件,通过主机应用程序调用插件的 XPC 来实例化对象,以便前者获得所有权。也许我应该措辞更好。无论如何,这可能吗?虽然这意味着插件目标要么需要在其包中包含框架的副本,要么可能将其框架搜索路径设置为 XPC 的 /Frameworks 产品路径(这里只是在黑暗中拍摄)。
    • 我遇到的问题是“插件”一词的使用。插件可以包含框架或库(在本地进程中运行),也可以是帮助程序(在单独的进程中运行)。既然您说您正在调用“插件的 XPC”,我将假设后者。
    • XPC 规则: (1) 从一个进程发送到另一个进程的所有对象都必须在另一端进行序列化(归档)和反序列化。 (2) 由于 (1),定义这些类的代码必须存在于两个进程中。 (3) 所有通过 XPC 发送的对象必须支持安全编码。因此,从概念上讲,就好像进程 A 中的对象被归档并写入文件,然后进程 B 读取该文件并重建这些相同的对象。这是他们得到的最接近的。如果这就是你所说的“获得所有权”,那么你很好。如果您需要其他内容,请说明。
    猜你喜欢
    • 2023-03-11
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多