将 Cocoa 实用程序拆分为辅助二进制文件 + 主应用程序二进制文件的优缺点?

Pros and cons of splitting Cocoa utility app into helper binary + main app binary?

我正在对一个旧的 Cocoa 实用程序进行现代化改造和沙盒化,并考虑各种方法。该应用程序位于菜单栏中并在后台运行,但会在单击图标时显示 Dock 图标和配置 window。

有两种方法:

一个。 LSUIElement=YES 的单个二进制文件,根据需要使用 TransformProcessType 显示和隐藏停靠栏图标。

乙。辅助工具执行实际的应用程序功能,管理菜单图标并始终在后台以 LSUIElement 模式运行。主应用程序显示配置 UI,仅在必要时启动。

该应用程序目前执行 A。我注意到许多长 运行 实用程序应用程序都有单独的辅助二进制文件,基本上执行 B。我的 Mac 上的示例包括 Paste HelperTimingHelperDiscord HelperCCC Helper(对于 Carbon Copy Cloner)、1Password Extension Helper.

我知道拥有一个单独的助手应用程序在概念上更纯粹,并且可能允许更好地分离沙盒权限,但它也更难实现,所以我怀疑这是所有这些应用程序选择拥有一个单独的应用程序的唯一原因辅助二进制文件。

所以:

  1. A和B的优缺点是什么,即为什么有些人选择B而不是A?这些天是否需要获得一些功能?

  2. 是否有可能在沙盒 Mac App Store 应用程序中让辅助工具比主应用程序寿命更长?

  3. 用什么API做这样的帮手?旧式授权 APIs 似乎已被弃用,并且 XPC 似乎不允许辅助应用程序在启动时启动(甚至比主应用程序寿命更长可能是 hacky)?

我怀疑如此多的开发人员选择选项 B 的原因是因为这种安排现在已通过 "Login Items" 工具融入 macOS。

简而言之,您的主应用程序嵌入了第二个(助手)应用程序,并且该应用程序被配置为 "Login Item"。 macOS 会检测到这一点,并自动将您的助手应用程序添加到用户的登录项中。您可以使用 SMLoginItemSetEnabled(...).

以编程方式控制它

您最终得到了一个用户熟悉的普通应用程序,以及一个在登录时自动启动并且可以 运行 在后台运行的辅助应用程序。我也很确定这包括您可以利用的免费 XPC 连接。

在臭名昭著的 Daemons and Services Programming Guide.

的“添加登录项”部分阅读所有相关内容

我自己从来没有这样做过(我目前安装后台应用程序作为用户代理,我可以这样做是因为我没有沙盒应用程序),但我确实为另一个项目研究过它并且我知道很多的应用程序执行此操作。

选项 A 的一个缺点(基于我自己的应用程序的用户反馈)是主应用程序不会像普通应用程序那样运行。使用 A 方法,您的用户要么无法退出该应用程序(因为它需要自动重启),要么您需要一种方法将其隐藏在停靠栏中,然后就没有(明显的)方法可以再次启动它。它只是变得混乱。如果您确实让您的用户退出该应用程序,那么后台功能就会消失,从而产生其他问题。