如何在 Mac App Store 上的 os x 应用程序中捆绑命令行实用程序(使用沙盒授权)

How can I bundle a command line utility in os x application on Mac App Store (using sandbox entitlement)

我有一个 c++ 命令行应用程序,我已经编译成可执行文件并将其添加到我的 Xcode 项目中。我还将 "Copy Files" 部分添加到项目属性的“构建阶段”选项卡,并添加了带有 "Executables" 目标的可执行文件。当我构建我的应用程序时,当我在构建的 test.app 上查看包内容时,我会在 test.app/Contents/MacOS 文件夹中看到它。

我还在项目的“功能”选项卡上启用了 App Sandbox(这样我就可以通过 mac 应用程序商店分发我的应用程序。

我如何才能将这个与我的应用程序捆绑在一起的命令行可执行文件公开给用户,以便他们可以从命令行(终端)运行 它?我无法在搜索引擎或 Whosebug 上找到任何有关如何将此文件(或此文件的符号链接)获取到用户 PATH 的信息。我尝试使用 NSTask 创建符号链接,但只有在我禁用 App Sandbox(这是有道理的)时才有效。有没有人这样做过?你是如何让它发挥作用的?或者这些可执行文件只能由您的应用程序中的代码执行吗?

我没有找到执行此操作的好方法。首先,澄清一下:PATH 是包含可执行文件的目录列表,而不是可执行文件列表;无法将单个可执行文件添加到 PATH。相反,您需要做的是将可执行文件放入用户 PATH 中的目录之一,或者将可执行文件所在的目录添加到 PATH 中。

在 OS X 上,默认路径是 /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin。前 4 个目录不应从系统默认值修改,因此只有 /usr/local/bin 是可能的。但是创建它(默认情况下不存在)需要管理员(实际上是 root)权限,这是 App Store 政策不允许的。这样就结束了。

剩下的就是修改用户的 PATH。 "right" 在系统范围内执行此操作的方法是在 /etc/paths.d 中放置一个文件,这需要管理员 (/root) 权限,因此也已过时。从技术上修改 /etc/paths 文件是可行的,但存在同样的权限问题,而且这是错误的自定义方式。

下一个可能性是修改(/创建)用户的 shell 初始化脚本。这行得通,但是完全正确地执行它会很混乱,因为用户可能会使用多个 shells,每个都有几个不同的可能的初始化脚本,用户可能已经创建也可能没有创建。 .

让我们来看一个非常简单的案例:一个只使用过 bash 并且还没有任何初始化脚本的用户。当 bash 的 "login" 实例启动时,它会查找 ~/.bash_profile、~/.bash_login 和 ~/.profile(按此顺序),然​​后运行它找到的第一个。但是你的应用不知道他用的是哪个 shell ,所以你最好创建 ~/.profile 这样 zsh 和 ksh 也会使用它。因此,您的应用创建 ~/.profile,并将其放入其中:

PATH="$PATH:/Applications/MyApp.app/Contents/Helpers"

很好,对吧?是的,很好,直到用户运行其他想要设置他们的 PATH 的东西,它会创建 ~/.bash_profile,这会覆盖你的设置。之后,您的可执行文件将位于 zsh 和 ksh 的 PATH 中,而不是 bash。呼。

然后有一天,用户决定改用 tcsh,它(和 csh)有一堆完全不同但同样混乱的可能初始化文件...