【发布时间】:2015-01-27 02:52:43
【问题描述】:
我目前正在开发一个应该在后台运行的 OS X 应用程序。这个应用程序应该能够通过为用户显示一个输入 GUI 来请求一些信息。
可能性:
现在我通过将 info.plist 中的“应用程序是代理 (UIElement)”键设置为 true 来使用单个应用程序作为 代理。它在系统状态栏中显示一个项目,并且可以显示我的首选项视图(可以使用
appDelegate的activateIgnoringOtherApps方法)。 使用代理是可行的,但问题是,此应用程序启动的任何窗口都算作一个窗口。所以 cmd-q-ing 窗口退出整个应用程序。而且使用这种activateIgnoringOtherApps方法似乎不太合法。所以我尝试的另一种可能性是使用子项目。在构建时,应用程序将 .app 文件从子项目复制到包含项目的资源中。 现在这些应用程序是完全独立的,cmd-q-ing 只是退出配置视图应用程序。但是这种方法存在一些问题:因为应用程序是独立的,它们根本无法交换数据。调试也很烦人,而且只有部分可能。
我考虑的另一种方法是使用应用扩展。这将解决数据交换的问题,因为应用程序扩展及其包含的应用程序可以具有共享数据容器。但是会有其他问题,同样点击 cmd-q 可能会退出调用扩展的应用程序。
然后我读到了XPC 服务,这可能是正确的做法。 XPC 我相信应该能够在应用之间传输数据。
还有“App Bundles”(也由扩展程序使用),其中多个应用程序可以共享相同的数据。我还没有尝试过这种方法。
所以基本上我的问题是:
运行后台应用程序的推荐方法是什么,能够通过 GUI 向用户请求数据?
要求:
- Cmd-q 不会退出后台进程
- 数据可以通过 gui 返回或保存在后台应用可以访问的地方
- 没有作弊的方法,我想用推荐的方法
- 完全可以调试
不想:
- 使用用户默认值(我有充分的理由)
任何帮助将不胜感激
谢谢
更新:
所以我阅读了很多关于 XPC 及其可能性的信息。 Daniel Eggert 在 objc.io 上有一个 great modern article 示例。
我想我会这样:
当主应用程序收到显示配置窗口的请求时,它将首先启动 GUI 应用程序(它还不会显示 GUI)。然后它将使用匿名侦听器创建与刚刚打开的应用程序的双向 XPC 连接。当用户完成输入后,GUI 应用通过 XPC 连接将输入发送回主应用。
但我不知道该怎么做。我只设法创建了与 XPC 服务的连接。我真的很想要一个使用双向连接的示例项目,因为我就是想不通(不过我会继续尝试)。
【问题讨论】:
标签: xcode macos user-interface background-process