在不启动应用程序的情况下提供OSX服务?

时间:2014-12-11 07:59:48

标签: objective-c macos cocoa service

我已经成功实施了一项"不露面的服务" (具有.service扩展名的仅限后台应用)并根据this question和网络上的其他教程将其投放(请参阅Apple's documentation)。

现在,我想通过我现有的单窗口GUI应用程序宣传服务。

我已经设置了我的应用程序的Info.plist文件来宣传该服务,并在构建应用程序时安装它。

但是当我从上下文菜单中调用服务(比如)TextEdit.app(我的服务根据特定标准为所选文本着色)时,我的应用程序启动了,主要窗口和所有内容。更糟糕的是,我右键单击辅助监视器中的TextEdit窗口,因此我的应用程序的主窗口在辅助监视器中立即显示,然后快速重新定位进入主显示器(这可能与我的窗口居中逻辑有关,但没关系......)。

我想提供服务(即,有我的应用程序中提供服务的类 实例化并执行其方法以响应请求),没有我的应用程序出现在Dock上或显示其窗口和主菜单。

这可能吗? Safari广告"使用Google搜索",所以应该可以......

编辑:现在我想到了,"用Google搜索"必须每次都启动Safari才能工作,所以这句话不适用。

也许我可以在-applicationWillFinishLaunching / -applicationDidFinishLaunching中添加一些逻辑来确定是否正在启动应用以响应服务,并跳过创建窗口(注意缺少withOptions:在OSX)?

但是,这感觉不对。

1 个答案:

答案 0 :(得分:3)

它确实有withOptions:的蹩脚版本 - NSApplicationLaunchIsDefaultLaunchKey会告诉您应用程序是否已启动:

  

打开或打印文件,执行服务操作,如果应用程序已保存将要恢复的状态,或者应用程序启动是否在其他意义上不是默认启动

因此,在applicationDidFinishLaunching中,您可以查看该密钥是否在通知中并设置为NO。不幸的是,告诉它是除了服务之外的其他可能性的主要方式,你必须检测并记录你是否还有application:openFile:等。