1

我正在用 Objective-C / Swift 编写沙盒 macOS 应用程序。我有兴趣以编程方式终止其他应用程序。在 Cocoa 中,有一个NSRunningApplication类公开了以下方法:

- (BOOL)terminate;

- (BOOL)forceTerminate;

这两种方法的文档都说:

沙盒应用程序无法使用此方法终止其他应用程序。从沙盒应用程序调用此方法时返回 false。

我习惯了来自苹果的神秘文档,我在想:文档清楚地说,如果从沙盒应用程序调用此方法不能用于终止其他应用程序,但从措辞来看,他们建议可能有另一种方法。有人知道NSRunningApplication从沙盒应用程序中终止实例的方法吗?非常感谢您的帮助。

4

1 回答 1

1

总的来说,我很确定答案是否定的。这会破坏沙盒的目的,而且我认为没有权利获得对流程服务或信号的访问权。

在某些特殊情况下,您可以通过要求进程自行终止来终止另一个进程。例如,一个接受套接字连接的服务器可能有一个可以接受的命令,作为它的通信协议的一部分,告诉它退出。显然,这将特定于每个这样的过程。

对于一般情况,认为您需要删除沙盒功能,这意味着应用程序没有应用商店放置 - 如果我没记错的话,苹果生态系统中唯一允许运行非沙盒应用程序的操作系统是 macOS,所以除了 Mac 应用程序之外,即使对其进行正式测试也不可能。

但是,如果它是 Mac 应用程序并且您将其取消沙箱化,则该应用程序将需要足够的权限来终止其他应用程序。这通常是通过创建一个特权帮助工具来完成的,该工具需要使用SMJobBless来启动。您可以使用特权运行应用程序本身,但出于安全原因,这是一个坏主意。通常,您只希望实现需要提升权限的功能的部分实际上具有提升的权限,这意味着一个单独的进程。因此,辅助工具。

为提升的权限设置帮助工具有点痛苦,但您可能会发现这个GitHub 存储库很有用(免责声明:它是我对另一个项目的分支)。

于 2021-03-12T20:48:23.877 回答