我目前正在开发一个应该在后台运行的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向用户请求数据?
要求:
不要:
任何帮助将不胜感激
谢谢
更新:
所以我读了很多关于XPC及其可能性的内容。 objc.io上有一个great modern article Daniel Eggert示例。
我想我会这样:
当主应用程序收到显示配置窗口的请求时,它将首先启动GUI应用程序(它还不会显示GUI)。然后,它将使用匿名侦听器创建与刚刚打开的应用程序的双向XPC连接。当用户完成输入后,GUI应用程序通过XPC连接将输入发送回主应用程序。
但我不知道该怎么做。我只设法创建到XPC服务的连接。我真的很喜欢使用双向连接的示例项目,因为我无法弄清楚(我会继续尝试)。
答案 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,虽然它不是我尝试过的。