从沙盒命令行应用程序获取当前工作目录
Posted
技术标签:
【中文标题】从沙盒命令行应用程序获取当前工作目录【英文标题】:Getting current working directory from a Sandboxed command-line app 【发布时间】:2015-07-17 12:53:32 【问题描述】:我现在正在尝试对我用 Objective-C 编写的命令行应用程序进行沙箱处理。
问题
当应用程序没有被沙盒化时,我可以使用[[NSFileManager defaultManager] currentDirectoryPath]
获取用户调用应用程序的目录。
但是,沙盒化后,无论从何处调用命令行应用程序,应用程序始终返回当前目录 /Users/MY_ACCOUNT/Library/Containers/BUNDLE_IDENTIFIER/Data
。
示例代码
实际上,我想知道用户作为命令参数传递的文件的绝对路径。
因此,例如,当我像这样调用我的命令行应用程序时:
$ pwd
/Users/MY_ACCOUNT/Desktop
$ ./foo/my_executable subfolder/myfile.txt
以下部分:
NSURL *url = [NSURL fileURLWithFileSystemRepresentation:argv[1] isDirectory:NO relativeToURL:nil];
printf("path: %s\n", [[url absoluteURL] fileSystemRepresentation]);
正确返回非沙盒应用:
path: /Users/MY_ACCOUNT/Desktop/subfolder/myfile.txt
但在沙盒应用上:
path: /Users/MY_ACCOUNT/Library/Containers/BUNDLE_IDENTIFIER/Data/subfolder/myfile.txt
这当然是不正确的。
问题
是否有任何替代方法可以在沙盒命令行应用程序中获取传递的文件路径参数的正确完整路径? 或者这只是不可能的,我最好放弃沙盒我的应用程序?
解决方案
最后,我自己找到了一个解决方案。
[NSProcessInfo processInfo]
中的 environment
属性具有正确的当前用户工作目录,即使应用是沙盒的。
NSDictionary *env = [[NSProcessInfo processInfo] environment];
NSString *currentPath = env[@"PWD"];
至少,当我在 Terminal.app 中调用该命令时,它可以工作。我不确定这个PWD
是否一直存在。
此外,正如@daij-djan 在下面指出的那样,我们甚至没有给定参数的读取权限。不过,不管怎样,这个问题的事情已经解决了。
(如果有人知道如何读取作为参数传递的路径的文件,请告诉我作为答案!)
【问题讨论】:
【参考方案1】:AFAIK(我不久前尝试过,所以事情可能已经改变了——不过我不这么认为)
通过命令行参数传递的路径将无法访问,即使您知道它们的真正位置:/
===> 所以:这就是我的答案.. 恐怕没有意义,因为它不起作用
【讨论】:
是的,这是另一个问题。命令行程序无法打开作为参数给出的文件真的很奇怪。 现在有一些方法可以让命令行工具访问这些路径(如果它随主机应用程序一起提供)。目前这也是苹果推荐的方式。所以这个问题还是有道理的。 这是一个主要的 CLI 应用程序。 op 想要非沙盒 URL 而不是沙盒。我仍然不明白它是如何工作的【参考方案2】:这将获取当前应用的沙盒路径。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *rootPath = [paths objectAtIndex:0];
请记住,在上面的代码返回沙盒路径之前,必须在项目设置中打开“沙盒”。
【讨论】:
感谢重播。但是,我不确定您的确切意思。由于我的应用程序是命令行,因此它在项目设置中没有可视功能选项卡。所以我直接在“构建设置”选项卡中设置我的权利,即使用CODE_SIGN_ENTITLEMENTS
和CODE_SIGN_IDENTITY
。还不够吗?
我不知道这有什么关系以上是关于从沙盒命令行应用程序获取当前工作目录的主要内容,如果未能解决你的问题,请参考以下文章