从Sandboxed命令行应用程序获取当前工作目录

时间:2015-07-17 12:53:32

标签: objective-c cocoa appstore-sandbox

我现在正在尝试使用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

但在沙盒 app:

path: /Users/MY_ACCOUNT/Library/Containers/BUNDLE_IDENTIFIER/Data/subfolder/myfile.txt

这当然是不正确的。

问题

有没有其他方法可以在Sandboxed命令行应用程序中获取传递的文件路径参数的正确完整路径? 或者它只是不可能而且我只是放弃沙盒我的应用程序会更好吗?

解决方案

最后,我自己找到了一个解决方案。

environment中的[NSProcessInfo processInfo]属性具有正确的当前用户工作目录,即使该应用是沙盒。

NSDictionary *env = [[NSProcessInfo processInfo] environment];
NSString *currentPath = env[@"PWD"];

至少,当我在Terminal.app中调用该命令时,它可以工作。我不确定这个PWD是否始终存在。

此外,As @ daij-djan在下面指出,我们甚至没有给定参数的读取权限。但是,无论如何,这个问题的问题一旦得到解决。

(如果有人知道如何阅读作为参数传递路径的文件,请告诉我答案!)

2 个答案:

答案 0 :(得分:0)

这将获取当前应用的沙盒路径。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *rootPath = [paths objectAtIndex:0];

请记住,在上面的代码返回沙盒路径之前,必须在项目设置中打开“沙箱”。

enter image description here

答案 1 :(得分:0)

AFAIK(我前一段时间试过这个,所以事情可能会改变 - 我不会想到这一点)

通过命令行args传递的路径即使你弄清楚它们到底在哪里也是不可访问的:/

===>所以:这就是我的答案..我很害怕,因为它不起作用