10

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

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

但是,在启动时,控制台会吐出一个错误,即不允许进程 xxxx 启动“foo.app”,因为用户之前没有启动过它。手动启动一次该过程后,它能够无错误地启动。

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

4

2 回答 2

15

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

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

  1. 在您的应用程序中包含 XPC 服务并为您启动它
  2. 您可以通过 NSTask 运行应用程序,这将导致该应用程序在启动时继承您的沙箱
  3. 您可以按名称启动应用程序,但据我所知,这通常仅在应用程序位于 /Applications 文件夹中时才有效,即 -[NSWorkspace launchApplication:]
  4. 您可以启动一个包含您的应用程序的应用程序,但前提是您已经 SMLoginItemSetEnabled()

我会说 osascript 调用有效,因为它的作用与 -[NSWorkspace launchApplication:] 大致相同。接受包标识符或绝对/相对路径的 LS 调用都不起作用。

于 2012-12-16T17:00:36.933 回答
0

Use osascript

osascript -e 'tell application "foo" to open'
于 2012-09-26T06:55:14.980 回答