沙箱 - killall不允许操作

时间:2012-05-29 23:48:16

标签: objective-c macos mac-app-store appstore-sandbox

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

system("killall Finder");

我想知道如果我沙盒应用程序会发生什么(因为沙盒将在6月1日需要),并且该应用程序将无法正常工作。我收到了以下回复:

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

你的应用程序完全违背了沙箱的精神,因此MAS审核员几乎没有机会接受它。此外,您可能会对“默认编写com.apple.finder”在沙盒中执行的操作感到惊讶 - 基本上没什么用处。您必须使用home-relative /Library/Preferences/com.apple.finder.plist的临时例外权利,使用一些非沙箱影响的API来获取回家的路径(例如,getpwent() - > pw_dir),并直接加载并保存plist。然后你会发现没有办法从沙盒应用程序调用非子进程,期间,没有办法 - 如果你尝试系统killall,它最终会在你的同一个沙箱中运行,因此也有同样的局限性。

然而,你问了一个特定的问题,是否有办法解决该系统killall失败的问题,并且至少有三个(沙箱中的漏洞没有被10.7.4堵塞,或者肯定会很快堵塞) ):

  1. 您可以创建一个非沙盒的帮助应用程序,为您提供killall。只有两个App Store批准的方法是XPC和SMLoginItemSetEnabled。如果没有用户明确告诉您这样做,则不允许您启用帮助程序。

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

  3. 您可以将Apple事件发送到其他一些类似于流程的系统事件 - 代表您杀死Finder。

  4. 等等。

答案 1 :(得分:0)

如果你有充分的理由仍然可以杀死这样的应用程序: How can I terminate my app in a helper app with sanboxing enabled?