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

nor*_*don 10 macos cocoa sandbox

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

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

但是,在启动时,控制台吐出一个错误,该错误不允许进程xxxx启动"foo.app",因为它之前尚未由用户启动.手动启动一次后,它可以无错误地启动.

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

rud*_*udy 14

您可以在很少的条件下启动另一个应用程序并获得所需的结果.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调用都不会起作用.


Par*_*fna 0

使用 osascript

osascript -e 'tell application "foo" to open'
Run Code Online (Sandbox Code Playgroud)