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

时间:2015-01-24 21:02:03

标签: objective-c macos sandbox

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

我还在项目的Capabilities选项卡上启用了App Sandbox(这样我就可以通过mac app store分发我的应用程序了。

如何将与我的应用程序捆绑在一起的命令行可执行文件公开给用户,以便他们可以从命令行(终端)运行它?我无法在搜索引擎或StackOverflow上找到有关如何将此文件(或此文件的符号链接)添加到用户PATH中的任何内容。我尝试使用NSTask来创建一个符号链接,但这只有在我禁用App Sandbox时才有效(这很有意义)。有没有人这样做过?你是怎么得到它的?或者这些可执行文件只能由应用程序中的代码执行吗?

1 个答案:

答案 0 :(得分:4)

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

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

这会修改用户的PATH。在系统范围内执行此操作的“正确”方法是在/etc/paths.d中放置一个文件,该文件需要admin(/ 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。 Whee。

然后有一天用户决定使用tcsh,而它(和csh)有一个完全不同但同样混乱的可能的init文件...