我现在正在尝试对我的命令行应用进行沙盒化,该应用是用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在下面指出的那样,我们甚至没有给定参数的读取权限。然而,无论如何,这个问题的事情一旦解决。
(如果有人知道如何读取作为参数传递的路径文件的方法,请告诉我作为答案!)