В изолированном приложении на основе NSDocument к любому совместимому документу можно получить доступ с помощью NSOpenPanel, независимо от того, где документ сохранен. Без NSOpenPanel приложение может получить доступ только к файлам в контейнере песочницы.
Поскольку мое приложение управляет двумя типами подклассов NSdocument (текст как средство чтения/записи и изображение только как средство чтения), я пытаюсь реализовать отдельное меню «Открыть последние» для изображений. Я отключил обычное поведение для них, когда они открываются пользователем, переопределив метод noteNewRecentDocumentURL: (NSURL *)url
NSDocumentController, чтобы возвращать НЕТ для URL-адресов изображений. Так что только текстовые документы появляются в обычном меню «Файл» -> «Открыть последние» (и открываются нормально, когда пользователь выбирает их). Изображения перечислены в пользовательском меню.
Проблема возникает с этими URL-адресами изображений, потому что приложение изолировано: приложение не может напрямую открыть любой файл изображения, указанный в специальном меню (любая операция чтения возвращает ошибку -54. Это поведение можно проверить, используя:
[[NSFileManager defaultManager] isReadableFileAtPath:[fileURL path]]
который всегда возвращает FALSE
в этой ситуации. Есть только одно исключение: когда я повторно открываю из специального меню Open Recent файл, который ранее был открыт с помощью NSOpenPanel в том же сеансе приложения, а затем закрывался: в этом случае isReadableFileAtPath:
возвращает TRUE
, и к файлу можно получить доступ . Но когда приложение закрывается и перезапускается, последние файлы изображений не могут быть доступны таким образом.
Я определил три решения для решения этой проблемы:
Перемещение файла изображения в контейнер песочницы, как только пользователь получил к нему "законный" доступ через NSOpenPanel. Работает, конечно, но не дает пользователю самостоятельно определять местонахождение своих файлов! Точно так же дублирование файла в песочнице не является решением.
Создание псевдонима для этих файлов в песочнице. Поскольку я не мог найти способ сделать это, я не мог проверить, является ли это решением или нет.
Отключите песочницу приложения. Но это худшее решение, так как есть много причин использовать песочницу!
Есть ли четвертое решение, которое разрешило бы доступ только для чтения к любому файлу изображения, где бы он ни находился, без отключения песочницы?