XPC 服务可以链接到嵌入它的框架吗?

Posted

技术标签:

【中文标题】XPC 服务可以链接到嵌入它的框架吗?【英文标题】:Can an XPC service link against the framework that embeds it? 【发布时间】:2018-06-05 04:41:52 【问题描述】:

我正在编写一个接受插件来实现一些操作的框架。由于这些插件不如第一方代码受信任,因此我想将它们托管在 XPC 服务中,我可以将其设置为非常无特权,并且可以防止对系统造成太大损害。

但是,插件应该可以访问与在进程内运行的第一方代码基本相同的 API。为了简单起见,我希望 XPC 进程链接到框架本身。

当然,问题在于框架嵌入了 XPC 进程,而 XPC 进程与框架链接。 Xcode 认为这是一个循环依赖并拒绝在此配置中构建。即使选中“仅在安装时复制”复选框也是如此。

由于在链接时不需要 XPC 服务,这可以说是人为的:可以构建框架二进制文件,然后是 XPC 服务,最后将服务复制到框架。

有没有办法达到这个效果?

【问题讨论】:

【参考方案1】:

是的,反转构建关系。使 XPC 服务将自身复制到框架中。您可能还需要退出框架。

删除XPC Service和Framework target之间的依赖关系,去掉“Copy XPC Services”步骤。

将运行脚本阶段添加到创建“Versions/A/XPCServices”文件夹(以及 .framework 根目录中的符号链接)的框架目标,但除此之外什么都不做。

在 XPC 服务目标链接框架。这创建了一个很好的目标依赖关系。添加一个运行脚本阶段。让脚本将 .xpc 包从 $(BUILT_PRODUCTS_DIR) 复制到正确的位置。类似rsync -av $BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME/ $BUILT_PRODUCTS_DIR/MyFramework.framework/Versions/A/XPCServices/$FULL_PRODUCT_NAME/

【讨论】:

以上是关于XPC 服务可以链接到嵌入它的框架吗?的主要内容,如果未能解决你的问题,请参考以下文章

与多个包共享框架的单个副本

SQLite 库可以嵌入(链接)到 Delphi 可执行文件吗?

我可以更改 XPC 服务的服务质量级别吗?

XPC 客户端等待服务加载

我需要嵌入 Crashlytics / Fabric 框架吗?

Xcode 5 上的 XPC 测试包