OS X:带有输入GUI的后台应用程序

时间:2015-01-27 02:52:43

标签: xcode macos user-interface background-process

我目前正在开发一个应该在后台运行的OS X应用程序。此应用程序应该能够通过为用户显示输入GUI来请求一些信息。

的可能性:

  • 现在我通过设置"应用程序是代理(UIElement)"使用单个应用程序作为代理。将info.plist中的键设置为true。它会在系统状态栏中显示一个项目,并可以显示我的首选项视图(可以使用activateIgnoringOtherApps的{​​{1}}方法)。 使用代理可以工作,但问题是,此应用程序启动的任何窗口都算作其中一个。所以cmd-q-ing窗口退出整个应用程序。使用这种appDelegate方法似乎并不合法。

  • 我尝试的另一种可能性是使用子项目。在构建时,应用程序将.app文件从子项目复制到包含项目的资源。 现在这些应用程序是完全独立的,cmd-q-ing只是退出配置视图应用程序。但是这种方法存在一些问题:由于应用程序是分开的,因此它们根本无法交换数据。调试也很烦人,只有部分可能。

  • 我考虑的另一种方法是使用 App Extension 。这将解决数据交换的问题,因为App Extensions及其包含的应用程序可以拥有共享数据容器。但是会出现其他问题,同时点击cmd-q可能会退出调用扩展程序的应用程序。

  • 然后我读到了 XPC服务,这可能是正确的方法。我认为XPC应该能够将数据从应用程序传输到应用程序。

  • 此外还有" 应用套装" (也由扩展程序使用),其中多个应用程序可以共享相同的数据。我还没有尝试过这种方法。

基本上我的问题是:

运行后台应用程序的推荐方法是什么,能够通过GUI向用户请求数据?

要求:

  • Cmd-q没有退出后台流程
  • 数据可以由gui返回,也可以保存在后台应用可以访问的地方
  • 没有欺骗性的方法,我想使用推荐的方式
  • 完全可以调试

不要:

  • 使用用户默认值(我有充分的理由)

任何帮助将不胜感激

谢谢

更新:

所以我读了很多关于XPC及其可能性的内容。 objc.io上有一个great modern article Daniel Eggert示例。

我想我会这样:

当主应用程序收到显示配置窗口的请求时,它将首先启动GUI应用程序(它还不会显示GUI)。然后,它将使用匿名侦听器创建与刚刚打开的应用程序的双向XPC连接。当用户完成输入后,GUI应用程序通过XPC连接将输入发送回主应用程序。

但我不知道该怎么做。我只设法创建到XPC服务的连接。我真的很喜欢使用双向连接的示例项目,因为我无法弄清楚(我会继续尝试)。

2 个答案:

答案 0 :(得分:1)

发布到App Store是完全不同的故事,我不知道。

我认为,直截了当的方法是sub-project类型。

NSConnection。它是一种IPC / RPC机制。不同的进程可以通过Objective-C方法调用几乎无缝地进行交互。

一个创建`NSConnection'对象和vend服务,另一个连接到售卖服务并获取远程对象,另一个可以通过它进行常规的Obj-C消息发送(函数调用)。

对于调试问题,防止Cmd-Q真的很狡猾。我们必须保证用户可以毫不费力地退出程序。因此,我认为,运行另一个后台进程是最安全和最合法的方式。

答案 1 :(得分:1)

  

应该在后台运行的OS X应用程序

这是一个守护进程'应用程序,可以是Launch Daemon or Launch Agent

启动守护程序应用程序在系统启动时启动,只有一个存在。相反,每个会话都存在启动代理,并在用户登录时开始。

守护程序应用程序不应该也不能显示UI。但是,为了满足您的要求,守护程序可以使用IPC(例如XPC,TcpIP,本地套接字或任何其他所需方法)与第二个应用程序进行通信,第二个应用程序为用户提供所需的UI并将其转发回守护程序, 按要求。

  

没有欺骗性的方法,我想使用推荐的方式

如果一种方法有效且安全,则不会将其定义为“作弊”。至于推荐的方法,Apple认为XPC是一种简单的IPC方法(在两个应用程序之间进行通信),但使用其他IPC机制并没有错。

至于使用activateIgnoringOtherApps,如果您的GUI是对用户的警报并且需要由用户处理,而且没有延迟,我在这里看不到使用它的问题。或者,GUI应用程序可以是启动代理,如果退出则设置为重新启动。

最后,你可以创建一个带XPC Helper application的守护进程来处理GUI,虽然它不是我尝试过的。