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