如何在Mac上的沙箱中启动另一个进程?

时间:2012-09-26 04:03:55

标签: macos cocoa sandbox

我想在Mac上的Sandbox中通过LSOpenApplication()启动另一个自己的应用程序。

当然,我在权利文件中的“com.apple.security.temporary-exception.files.absolute-path.read-write”中添加了一行用于启动。

然而,在启动时,控制台吐出一个错误,该错误不允许进程xxxx启动“foo.app”,因为它以前没有被用户启动过。 手动启动过程后,它可以无错误地启动。

即使之前没有启动,我该如何启动该流程? 这与沙盒无关吗?

2 个答案:

答案 0 :(得分:14)

在极少数情况下,您可以启动另一个应用程序并获得所需的结果。 com.apple.security.temporary-exception.files.absolute-path.read-write对LaunchServices没有任何帮助,因此您可以删除该权利。

作为一个沙盒应用程序,您实际上可以进行子启动,这是一种有意的行为,因为启动另一个应用程序在技术上违反了沙箱模型。您可以使用的方式是:

  1. 在您的应用程序中包含XPC服务,并已启动为您启动
  2. 您可以通过NSTask运行应用程序,这将导致此应用程序在启动时继承您的沙箱
  3. 您可以按名称启动应用程序,但从我所看到的情况来看,这通常只有在应用程序位于您的/ Applications文件夹中时才有效,即 - [NSWorkspace launchApplication:]
  4. 你可以启动一个包含你的应用程序的应用程序,但前提是你已经是SMLoginItemSetEnabled()
  5. 我会说osascript调用有效,因为它与 - [NSWorkspace launchApplication:]大致相同。接受包标识符或绝对/相对路径的LS调用都不起作用。

答案 1 :(得分:0)

使用osascript

osascript -e 'tell application "foo" to open'