Получение текущего рабочего каталога из приложения командной строки Sandboxed

Сейчас я пытаюсь поместить в песочницу свое приложение командной строки, написанное на 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 ниже, у нас нет даже разрешения на чтение для заданных аргументов. Впрочем, в любом случае вопрос этого вопроса когда-то решится.

(Если есть кто-то, кто знает, как прочитать файл, путь которого был передан в качестве аргумента, скажите, пожалуйста, в качестве ответа!)


person 1024jp    schedule 17.07.2015    source источник


Ответы (2)


AFAIK (я пробовал это некоторое время назад, так что все МОЖЕТ измениться - хотя я не думаю)

Пути, переданные через аргументы командной строки, не будут доступны, даже если вы выяснили, где они на самом деле:/

===> Итак: это мой ответ.. боюсь, это бессмысленно, потому что это не работает

person Daij-Djan    schedule 18.07.2015
comment
Да, это другая проблема. Действительно странно, что программа командной строки не может открывать файлы, которые были переданы в качестве аргументов. - person 1024jp; 18.07.2015
comment
Теперь есть способы предоставить инструментам командной строки доступ к этим путям, если они поставляются с хост-приложением. На данный момент это также рекомендуемый способ Apple. Так что этот вопрос все еще имеет смысл. - person Daniel; 17.11.2020
comment
это для основного приложения CLI. оператору нужен URL-адрес без песочницы вместо песочницы. я до сих пор не понимаю, как это сработает - person Daij-Djan; 21.11.2020

Это получает изолированный путь для текущего приложения.

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

Помните, что «Песочница» должна быть включена в настройках проекта, прежде чем приведенный выше код вернет путь к песочнице.

введите здесь описание изображения

person d00dle    schedule 17.07.2015
comment
Спасибо за повтор. Однако я не уверен, что именно вы имеете в виду. Поскольку мое приложение представляет собой командную строку, у него нет вкладки «Визуальные возможности» в настройках проекта. Поэтому я устанавливаю свои права прямо на вкладке Build Settings, а именно с помощью CODE_SIGN_ENTITLEMENTS и CODE_SIGN_IDENTITY . Разве этого недостаточно? - person 1024jp; 18.07.2015
comment
не понимаю, как это связано, я боюсь - person Daij-Djan; 18.07.2015