Objective c 如何在Mac App Store上的os x应用程序中绑定命令行实用程序(使用沙盒授权) 我有一个C++命令行应用程序,我已经编译成一个可执行文件,并将它添加到XCODE项目中。我还将“复制文件”部分添加到项目属性的“构建阶段”选项卡中,并将我的可执行文件添加到“可执行文件”目标中。当我构建应用程序时,当我查看构建的test.app上的包内容时,我会在test.app/Contents/MacOS文件夹中看到它

Objective c 如何在Mac App Store上的os x应用程序中绑定命令行实用程序(使用沙盒授权) 我有一个C++命令行应用程序,我已经编译成一个可执行文件,并将它添加到XCODE项目中。我还将“复制文件”部分添加到项目属性的“构建阶段”选项卡中,并将我的可执行文件添加到“可执行文件”目标中。当我构建应用程序时,当我查看构建的test.app上的包内容时,我会在test.app/Contents/MacOS文件夹中看到它,objective-c,macos,sandbox,Objective C,Macos,Sandbox,我还在项目的“功能”选项卡上启用了应用程序沙盒(以便我可以通过mac App store分发我的应用程序) 如何向用户公开与我的应用程序捆绑在一起的此命令行可执行文件,以便他们可以从命令行(终端)运行它?我在搜索引擎或StackOverflow上找不到有关如何获取此文件(或此文件的符号链接)的任何信息进入用户路径。我尝试使用NSTask创建符号链接,但只有禁用应用程序沙盒(这是有意义的)时才有效。以前有人这样做过吗?您是如何让它工作的?或者这些可执行文件只能通过应用程序中的代码执行吗?我看不出一

我还在项目的“功能”选项卡上启用了应用程序沙盒(以便我可以通过mac App store分发我的应用程序)


如何向用户公开与我的应用程序捆绑在一起的此命令行可执行文件,以便他们可以从命令行(终端)运行它?我在搜索引擎或StackOverflow上找不到有关如何获取此文件(或此文件的符号链接)的任何信息进入用户路径。我尝试使用NSTask创建符号链接,但只有禁用应用程序沙盒(这是有意义的)时才有效。以前有人这样做过吗?您是如何让它工作的?或者这些可执行文件只能通过应用程序中的代码执行吗?

我看不出一个好的方法来执行此操作。首先,需要澄清的是:路径是包含可执行文件的目录列表,而不是可执行文件列表;无法将单个可执行文件添加到路径中ad,您需要做的是将可执行文件放入用户路径中的一个目录中,或者将可执行文件所在的目录添加到该路径中

在OS X上,默认路径为/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin。前4个目录不应根据系统默认值进行修改,因此只能修改/usr/local/bin。但是创建它(默认情况下不存在)需要管理员(实际上是root)权限,这是应用商店策略所不允许的。因此,这是不可能的

这就留下了修改用户路径的问题。在系统范围内,正确的方法是将一个文件放在/etc/PATH.d中,这需要管理员(/root)权限,所以这也不存在。从技术上来说,修改/etc/PATH文件是可行的,但这也有同样的权限问题,而且进行自定义是错误的方法

下一种可能是修改(/create)用户的shell初始化脚本。这会起作用,但做得好会很麻烦,因为用户可能会使用几个shell,每个shell都有用户可能创建或可能没有创建的几个不同的初始化脚本

让我们举一个非常简单的例子:一个只使用bash的用户,他还没有任何初始化脚本。当bash的“login”实例启动时,它会查找~/.bash\u profile、~/.bash\u login和~/.profile(按顺序),并运行它找到的第一个。但你的应用程序不知道他使用的是哪个shell,因此你最好创建~/.profile,以便zsh和ksh也使用它。因此,你的应用程序创建~/.profile,并将其放入其中:

PATH="$PATH:/Applications/MyApp.app/Contents/Helpers"
很好,对吗?是的,很好,直到用户运行其他想要设置其路径的东西,它才会创建~/.bash_配置文件,这会覆盖您的设置。之后,您的可执行文件将位于zsh和ksh的路径中,但不是bash.Whee


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

您可以将可执行文件添加到test.app/Contents/Helpers/。阅读“嵌套代码”此文档的第节->我已将可执行文件复制到目录/帮助程序,但它仍然没有显示在我的路径中。只需向命令行应用程序添加权限,以便与沙盒应用程序一起使用。这里的问题是,他没有向其命令行应用程序添加权限。@ElTomato默认情况下,可执行文件启动d从命令行运行unsandboxed。