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

102*_*4jp 5 cocoa objective-c 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
Run Code Online (Sandbox Code Playgroud)

以下部分:

NSURL *url = [NSURL fileURLWithFileSystemRepresentation:argv[1] isDirectory:NO relativeToURL:nil];
printf("path: %s\n", [[url absoluteURL] fileSystemRepresentation]);
Run Code Online (Sandbox Code Playgroud)

正确返回非沙盒应用程序:

path: /Users/MY_ACCOUNT/Desktop/subfolder/myfile.txt
Run Code Online (Sandbox Code Playgroud)

但在Sandboxed应用程序上:

path: /Users/MY_ACCOUNT/Library/Containers/BUNDLE_IDENTIFIER/Data/subfolder/myfile.txt
Run Code Online (Sandbox Code Playgroud)

这当然是不正确的.

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


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

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

NSDictionary *env = [[NSProcessInfo processInfo] environment];
NSString *currentPath = env[@"PWD"];
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dai*_*jan 0

AFAIK(我不久前尝试过这个,所以事情可能已经改变了——但我不认为)

通过命令行参数传递的路径将无法访问,即使您知道它们的实际位置:/

===>所以:这就是我的答案..我担心它毫无意义,因为它不起作用