2

我正在编写一个运行以下命令的小型 Mac 应用程序(在 Obj-C 中):

system("killall Finder");

我想看看如果我对应用程序进行沙盒处理(因为 6 月 1 日将需要沙盒处理)会发生什么,并且该应用程序将无法运行。我得到以下回复:

killall: warning: kill -TERM 6524: Operation not permitted

有没有办法解决这个问题?就像在特定的权利中添加或以其他方式运行命令?

提前致谢。

4

2 回答 2

2

你的应用完全违背了沙盒的精神,所以 MAS 的审稿人几乎不可能接受它。此外,您可能会惊讶于“defaults write com.apple.finder”在您的沙箱中所做的事情——基本上没有什么用处。您必须对 home-relative /Library/Preferences/com.apple.finder.plist 使用临时异常权利,使用一些不受沙盒影响的 API 来获取 home 路径(例如,getpwent()->pw_dir ),然后直接加载和保存 plist。然后你会发现没有办法从沙盒应用程序调用非子进程,期间,没有办法绕过它 - 如果你尝试系统 killall,它最终会在与你相同的沙盒中运行,因此具有相同的限制。

但是,您问了一个具体问题,即是否有办法绕过该系统 killall 失败,并且至少有三个(不包括沙盒中的漏洞,这些漏洞要么已被 10.7.4 堵塞,要么肯定会很快被堵塞):

  1. 您可以创建一个没有沙盒的助手应用程序,它会为您完成所有工作。仅有的两种 App Store 批准的方法是 XPC 和 SMLoginItemSetEnabled。如果没有用户明确告诉你这样做,你就不能启用帮助程序。

  2. 您可以向 Finder 发送一个 Apple 事件,要求它退出,而不是发出信号。最简单的方法是执行 Applescript '告诉应用程序“Finder”退出'。至少对于 10.7.3 和更早版本,您需要临时的异常权利才能将 Apple 事件发送到 com.apple.finder。(未来的操作系统版本可能会有不同的机制,但没有人可以在 NDA 论坛之外讨论它们。)

  3. 您可以将 Apple 事件发送到其他进程(如系统事件)以代表您终止 Finder。

等等。

于 2012-05-30T00:21:32.970 回答
0

如果您有充分的理由仍然可以杀死这样的应用程序: 如何在启用了 sanboxing 的帮助应用程序中终止我的应用程序?

于 2014-10-20T19:26:22.623 回答