【问题标题】:OS X: Background application with input GUIOS X:带有输入 GUI 的后台应用程序
【发布时间】:2015-01-27 02:52:43
【问题描述】:

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

可能性:

  • 现在我通过将 info.plist 中的“应用程序是代理 (UIElement)”键设置为 true 来使用单个应用程序作为 代理。它在系统状态栏中显示一个项目,并且可以显示我的首选项视图(可以使用appDelegateactivateIgnoringOtherApps 方法)。 使用代理是可行的,但问题是,此应用程序启动的任何窗口都算作一个窗口。所以 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


    【解决方案1】:

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

    我认为,直接的方法是你的sub-project 类型。

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

    一个创建“NSConnection”对象并提供服务,另一个连接到提供的服务并获取远程对象,另一个可以使用这些对象进行通常的 Obj-C 消息发送(函数调用)。

    对于调试问题,阻止 Cmd-Q 确实是骗人的。我们必须确保用户可以轻松退出程序。因此,我认为,运行另一个后台进程是最安全、最合法的方式。

    【讨论】:

      【解决方案2】:

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

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

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

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

      没有作弊的方法,我想用推荐的方法

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

      至于使用activateIgnoringOtherApps,如果您的GUI 是对用户的警告并且需要由用户立即处理,我认为在这里使用它没有问题。或者,GUI 应用程序可以是启动代理,设置为在退出时重新启动。

      最后,您也许可以使用XPC Helper application 创建一个守护进程来处理 GUI,尽管我没有尝试过。

      【讨论】:

      • 我阅读了有关 XPC 连接的信息,我想我现在有一个好主意,当它工作时我会在这里分享它
      猜你喜欢
      • 2015-12-30
      • 2016-06-07
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      相关资源
      最近更新 更多