我正在对一个旧的Cocoa实用程序进行现代化和沙盒化,并在考虑各种方法。该应用程序位于菜单栏中并在后台运行,但单击该图标时会显示Dock图标和配置窗口。
有两种方法:
A。带有LSUIElement=YES
的单个二进制文件,并根据需要使用TransformProcessType
显示和隐藏停靠图标。
B。辅助工具会执行实际的应用程序功能,管理菜单图标,并始终在后台以LSUIElement
模式运行。主应用程序显示配置UI,仅在必要时启动。
该应用程序当前运行A。我注意到许多长期运行的实用程序应用程序具有单独的帮助程序二进制文件,而基本运行B。我的Mac上的示例包括Paste Helper
,TimingHelper
,{{1} },Discord Helper
(用于复本抄袭),CCC Helper
。
我知道拥有一个单独的助手应用程序在概念上更纯净,并且可能允许更好地分离沙盒特权,但是它也更难以实现,因此我怀疑这是所有这些应用程序选择拥有单独的助手二进制文件的唯一原因
所以:
A和B的优缺点是什么,即为什么有人选择B而不是A?这些天是否需要一些功能?
在沙盒化Mac App Store应用程序中甚至有可能有帮助工具比主应用程序有效吗?
一个人使用什么API做这样的助手?老式的授权API似乎已被弃用,而XPC似乎并不允许它在启动时启动助手应用程序(甚至使主应用程序失效也可能很hack)?
答案 0 :(得分:2)
我怀疑如此之多的开发人员选择选项B的原因是因为这种安排现在已通过“登录项”功能引入了macOS。
简而言之,您的主应用程序嵌入了第二个(帮助程序)应用程序,并且该应用程序被配置为“登录项”。 macOS会检测到此情况,并自动将您的助手应用程序添加到用户的登录项目中。您可以使用SMLoginItemSetEnabled(...)
以编程方式控制它。
最终您会得到用户熟悉的常规应用程序,以及一个自动在登录时启动并可以在后台运行的助手应用程序。我也很确定这包括免费的XPC连接,您可以利用它。
在臭名昭著的Daemons and Services Programming Guide的“添加登录项”部分中了解所有相关信息。
我从来没有自己做过这件事(我目前作为用户代理安装后台应用程序,之所以可以这样做是因为我没有沙盒应用程序),但是我确实为另一个项目进行了研究,并且我知道很多应用程序做这个。
选项A(基于我自己的应用程序的用户反馈)的一个缺点是主应用程序不会像常规应用程序那样工作。使用A方法,您的用户要么无法退出该应用程序(因为它将需要自动重启),要么您需要一种将其隐藏在扩展坞中的方法,然后没有(显而易见的)方法可以再次启动它。只是令人困惑。如果您确实让用户退出应用程序,则后台功能将消失,这会带来其他问题。