在我的 Swift 应用程序中使用来自 XPC 服务的 Objective-C 协议

Posted

技术标签:

【中文标题】在我的 Swift 应用程序中使用来自 XPC 服务的 Objective-C 协议【英文标题】:Using an Objective-C protocol from my XPC Service in my Swift app 【发布时间】:2015-09-08 18:23:41 【问题描述】:

我有一个用 Swift 编写的应用程序,专门用 Swift 编写,从来没有 Obj-C 类,没有 Obj-C 文件或桥接头。

为了在不影响我的应用程序权利的情况下添加一些功能,我正在尝试添加一个 XPC 服务——我在 Xcode 中创建了它,而 Xcode 中 XPC 服务的模板仅是 Obj-C。

这很好,我在 Obj-C 中编写了我的服务,但是现在当我想通过 NSXPCConnection 调用我的服务时,我必须设置它的接口,为此我需要参考,在我的 Swift 应用程序代码中,指向我为 XPC 目标编写的 Obj-C 协议。

我该怎么做?我不能只将“Protocol.h”添加到我的应用程序目标中,它没有 C 标头的规则。我发现的所有其他评论似乎只适用于链接到框架中的协议或公共目标......

【问题讨论】:

我很好奇你将如何设法完成这项工作,我只能提出以下建议:将 Protocol.h 添加到你的 Swift 应用程序中,添加 @987654323 @ 到那个应用程序(最简单的方法是创建然后删除一个 Obj-C 类并在提示时单击 创建桥接头),并在桥接头中 #import "Protocol.h"。然后,您将能够选择继承 NSObjectSwift 类,并使其采用 Protocol 我决定暂时将功能引入应用程序,将其放入 XPC 会很好,但这不是强制性的。我缺乏在没有模板的情况下快速构建 XPC 服务所需的 Xcode-do,我会等到 Apple 推出一个。我尝试了几种不同的方法,但没有任何效果...... 你知道吗,我刚刚开始构建它,让我确保它有效,我会写出来。 【参考方案1】:

好的,所以我想出了一个解决方案。

1) 删除了 Obj-C 服务类和协议样板文件。

2) 快速编写了我的协议和出售对象类。确保这些可以导出到 Obj-C。

3) 将 protocol.swift 文件添加到我的应用程序的目标中。将#import "Service-Swift.h" 添加到我的服务的main.m

所以现在我的 XPC 对象是用 Swift 实现的,我的对象协议是 swift 的,唯一的非 swift 文件是我的 XPC 的主文件。

【讨论】:

你也可以使用main.swift来远离Objective-C。【参考方案2】:

据我了解,您甚至可以更改主文件。 https://www.objc.io/issues/14-mac/xpc/

【讨论】:

以上是关于在我的 Swift 应用程序中使用来自 XPC 服务的 Objective-C 协议的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XPC 服务中提供 Swift 类?

当取消处理程序引用自身时,在 -dealloc 中取消 XPC 连接

哪个处理程序在 macos xpc 中处理来自服务器的回复

授权 XPC 连接

XPC 没有为 XPC 服务创建任何进程

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