如何在Mac App Store上使用沙盒权限打包OS X应用程序中的命令行工具

4
我有一个C++命令行应用程序,已经编译成可执行文件并添加到我的Xcode项目中。我还在项目属性的“Build Phases”选项卡中添加了“Copy Files”部分,并将可执行文件添加到“Executables”目标中。当我构建我的应用程序时,在View package contents上我可以看到它在test.app/Contents/MacOS文件夹中。
我在项目的功能选项卡中启用了App Sandbox(这样我就可以通过Mac应用商店分发我的应用程序)。
如何将捆绑在我的应用程序中的命令行可执行文件暴露给用户,以便他们可以从命令行(终端)运行它?我没有找到任何关于如何将此文件(或指向此文件的符号链接)添加到用户的PATH中的搜索引擎或StackOverflow信息。我尝试使用NSTask创建符号链接,但这只适用于禁用App Sandbox的情况(这很合理)。是否有人做过这个?你是怎么做到的?或者这些可执行文件只能由应用程序内的代码执行?

您可以将可执行文件添加到test.app/Contents/Helpers/中。请阅读此文档的“嵌套代码”部分-> https://developer.apple.com/library/mac/technotes/tn2206/_index.htm - JamesWebbTelescopeAlien
我将可执行文件复制到Contents/Helpers,但它仍然没有出现在我的路径中。 - user2879327
只需为您的命令行应用程序添加一个权限,即可在沙盒应用程序中使用它。 - El Tomato
1个回答

4
我看不到一个好的方法来做这件事。首先,需要澄清的是:PATH是包含可执行文件的目录列表,而不是可执行文件列表;因此无法将单个可执行文件添加到PATH中。你需要做的是将你的可执行文件放入用户PATH中的一个目录中,或者将包含你的可执行文件的目录添加到PATH中。
在Mac OS X上,默认的PATH是/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin。前四个目录不应该从系统默认值进行修改,所以只有/usr/local/bin是可能的。但创建它(默认情况下不存在)需要管理员(实际上是root)权限,这被App Store政策禁止。因此不能这样做。
这就只剩下修改用户的PATH了。在整个系统范围内正确的方法是在/etc/paths.d中放置一个文件,这需要管理员(/root)权限,因此这也不行。从技术上讲,修改/etc/paths文件可以起作用,但这具有相同的权限问题,而且这是定制的错误方式。
下一个可能性是修改(/创建)用户的shell初始化脚本。这个方法会起作用,但是正确地完成这个工作将会很麻烦,因为用户可能使用几种不同的shell,并且每种shell都有几种不同的初始化脚本,用户可能已经创建了,也可能没有创建。
让我们考虑一个非常简单的情况:一个仅使用bash且没有任何初始化脚本的用户。当“登录”bash实例启动时,它会查找~/.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)具有完全不同但同样混乱的可能的初始化文件堆栈......


问题在于他没有为他的命令行应用程序添加授权。 - El Tomato
默认情况下,从命令行启动的可执行文件运行时不会进行沙盒化。 - Gordon Davisson

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