Сейчас я пытаюсь поместить в песочницу свое приложение командной строки, написанное на 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
но в приложении Sandboxed:
path: /Users/MY_ACCOUNT/Library/Containers/BUNDLE_IDENTIFIER/Data/subfolder/myfile.txt
Это конечно неправильно.
Вопрос
Есть ли альтернативный способ получить правильные полные пути переданных аргументов пути к файлу в изолированном приложении командной строки? Или это просто невозможно, и лучше просто отказаться от песочницы моего приложения?
Решение
Наконец, я нашел одно из решений самостоятельно.
Свойство environment
в [NSProcessInfo processInfo]
имеет правильный текущий рабочий каталог пользователя, даже если приложение находится в песочнице.
NSDictionary *env = [[NSProcessInfo processInfo] environment];
NSString *currentPath = env[@"PWD"];
По крайней мере, когда я вызываю команду в Terminal.app, она работает. Я не уверен, всегда ли существует этот PWD
.
Кроме того, как указал @daij-djan ниже, у нас нет даже разрешения на чтение для заданных аргументов. Впрочем, в любом случае вопрос этого вопроса когда-то решится.
(Если есть кто-то, кто знает, как прочитать файл, путь которого был передан в качестве аргумента, скажите, пожалуйста, в качестве ответа!)