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

标签 macos cocoa sandbox

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

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

但是,启动时,控制台抛出错误,不允许进程 xxxx 启动“foo.app”,因为用户之前尚未启动它。 手动启动一次进程后即可正常启动。

即使之前没有启动过,如何启动该进程? 这和沙箱没有关系吗?

最佳答案

在极少数情况下,您能够启动另一个应用程序并获得所需的结果。 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 调用都不会起作用。

关于macos - 如何在Mac上的沙箱中启动另一个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12594380/

相关文章:

CSS 字体系列在 Windows 和 Mac OS X 上显示不同

macos - OSX 的 VPN IP 绑定(bind)选项?

cocoa - Dropbox 的内置通知系统

c++ - Objective-C++/Cocoa 尝试创建一个带有按钮的窗口,但不起作用?

objective-c - Sparrow/Twitter 类似 UIt 标签栏

macos - 如何在 Objective-C 中读取和写入 plist 中的数据? (不是 iOS,OS X 的常规 Cocoa)

paypal - 无法使用 Paypal Sandbox 帐户登录

ios - 什么时候创建新的 NSURLSession?

python - 如何阻止脚本的所有网络访问?

xcode - OSX 上适用于 Apple Sandbox 的代码签名帮助程序应用程序