В Какао: Как установить разрешение на чтение / запись в папку?

Я преобразовываю размер изображения, а затем сохраняю новый файл в ту же директорию, где находится исходный файл изображения.

Я могу только установить разрешение для каталога "images". Если моему приложению нужно выбрать изображение, находящееся внутри этого каталога, оно будет работать как положено. Если я выберу изображение, которое находится в другом каталоге (например, в папке, созданной пользователем), новое изображение не появится. В изолированной программной среде приложения я вижу только каталог "файл, выбранный пользователем", каталог "images", каталог "download", каталог "pictures", каталог "music" и каталог "movies".

Есть ли способ дать это разрешение программно?

1 ответ

Решение

Вы столкнулись с давней заботой о модели песочницы; поддержка приложений, которые преобразуют входной документ в выходной документ в том же месте.

Apple обратилась к подмножеству проблемы с NSIsRelatedItemType запись для типов документов в приложении Info.plist, Если этот флаг присутствует и YES в нескольких записях типов документов вашему приложению при предоставлении доступа к файлу одного из этих типов предоставляется право создавать файл любого другого типа.

Например, TextEdit имеет этот флаг установлен для .txt, .rtf а также .rtfd типы файлов, поэтому, получив доступ к файлу любого из этих типов, он может создать файл с тем же именем, но с любым другим типом, без дополнительного разрешения пользователя. Это включает команду, такую ​​как "Преобразовать в обычный текст".

Из вашего вопроса следует, что вы не делаете этого, а говорите, преобразовав "image.png" в "image-resized.png", то есть изменив имя, а не тип. Это не поддерживается без получения приложением дополнительных разрешений от пользователя.

Лучший обходной путь, который у вас есть, - это попросить пользователя разрешить доступ к вложенным папкам с файлами, размер которых он желает изменить. Как только приложение получит это, оно может выполнить любое количество созданий файлов в этой папке - так же, как вы наблюдали за разрешениями, которые предоставляют доступ к определенным специальным папкам.

Один процесс, которым вы можете следовать:

1 - Когда нужно создать выходной файл, проверьте, имеет ли приложение доступ к папке, в которой он находится - вы можете использовать access функция для этого (см. раздел 2 руководства OS X, например, "доступ человека" в Терминале или поиск доступа в документах Xcode).

3 - (Да, я пропустил 2, см. Ниже) Если у вас нет доступа, запросите его у пользователя для содержащей папки - подбросьте подходящую NSOpenPanel предлагая им выбрать папку с объяснением причин.

4 - Получив доступ, сохраните его - сохраните закладку с защитой для этой папки в файле в каталоге приложений "Поддержка приложений". Вы можете "обрезать" кэш по мере его создания - закладка для любой папки устраняет необходимость в закладке для любой папки под ней в дереве файловой системы. Это позволяет:

2 - Если у вас нет доступа, проверьте кэш сохраненных закладок и посмотрите, есть ли у вас папка, если таковая есть, активируйте ее. Обратите внимание, что эта проверка предназначена для закладки для содержащейся папки или любой из ее родительских папок в дереве файловой системы.

Используя этот процесс, вы накапливаете доступ к папкам, которые использует ваш пользователь. Вы должны предоставить пользователям способ очистки кеша.

Это не так плохо, как кажется! НТН.

Другие вопросы по тегам