从沙盒化命令行应用中获取当前工作目录

7

我现在正在尝试对我的命令行应用进行沙盒化,该应用是用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在下面指出的那样,我们甚至没有给定参数的读取权限。然而,无论如何,这个问题的事情一旦解决。

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

2个回答

0

据我所知(我之前尝试过,所以情况可能已经改变了——但我不这么认为)

通过命令行参数传递的路径即使你找到了它们的真实位置,也是无法访问的 :/

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


是的,这是另一个问题。一个命令行程序不能打开作为参数给定的文件,这真的很奇怪。 - 1024jp
现在有方法可以让命令行工具访问这些路径,如果它与主机应用程序一起提供。目前这也是苹果推荐的方式。因此这个问题仍然是有意义的。 - Daniel
这是针对主CLI应用程序的内容。操作者想要非沙盒URL而不是沙盒。我仍然不明白那会如何工作。 - Daij-Djan

0

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

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

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

enter image description here


谢谢您的回复。但是,我不确定您的意思。由于我的应用程序是命令行,因此在项目设置中没有可视化的功能选项卡。因此,我直接在“构建设置”选项卡中设置了我的权限,即使用 CODE_SIGN_ENTITLEMENTSCODE_SIGN_IDENTITY。这样不够吗? - 1024jp
很抱歉,我不明白这个与编程有什么关系。 - Daij-Djan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接