如何在Mac上启动另一个沙盒进程?

11
我希望能够在 Mac 上的沙盒中使用 LSOpenApplication() 启动另一个自己的应用程序。
当然,我已经在 entitlements 文件中添加了一行 'com.apple.security.temporary-exception.files.absolute-path.read-write' 以便启动。
但是,在启动时,控制台会输出一个错误,该错误是不允许进程 xxxx 启动 "foo.app",因为用户尚未先启动它。 在手动启动进程一次后,就可以无错误启动。
如何在之前没有启动的情况下启动进程? 这与沙箱化无关吗?

如果使用名称(或者 bundle ID)代替 FSRef 是可接受的,可以尝试这样做:https://dev59.com/PGw05IYBdhLWcg3wUAQ0#7311283 - Peter Hosey
谢谢。但是,即使使用应用程序名称和launchApplication函数,它也无法启动。 可能,目标应用程序需要用户在OS X Lion和Mountain Lion上至少启动一次才能正常启动。 - noridon
2个回答

17

在很少的情况下,您将能够启动另一个应用程序并获得期望的结果。 com.apple.security.temporary-exception.files.absolute-path.read-write对于LaunchServices无任何帮助,因此您可以删除该权限。

作为一个沙盒应用程序,您在实际子启动方面受到相当大的限制,这是一种故意行为,因为启动另一个应用程序在技术上是违反沙盒模型的。可用的方法有:

  1. 将XPC服务包含在您的应用程序中,并让launchd为您启动它
  2. 您可以通过NSTask运行应用程序,这将导致此应用程序在启动时继承您的沙箱
  3. 您可以按名称启动应用程序,不过据我所见,只有应用程序位于/应用程序文件夹中时才有效,即-[NSWorkspace launchApplication:]
  4. 如果您已经SMLoginItemSetEnabled(),则可以启动包含您的应用程序的应用程序

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


1
成功从 XPC 服务中启动! - noridon
只要您不打算提交到MacAppStore并且没有对XPC服务进行沙盒化,那么这应该是可行的。如果您要提交到应用商店,他们将强制您对XPC服务进行沙盒化。 - rudy

0
使用osascript
osascript -e 'tell application "foo" to open'

谢谢Parag。这是否意味着使用osascript而不是调用函数? - noridon
我不知道为什么在沙盒应用中LSOpenApplication()函数无法工作,但osascript可以正常运行。 - Parag Bafna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接