В Какао: Как установить разрешение на чтение / запись в папку?
Я преобразовываю размер изображения, а затем сохраняю новый файл в ту же директорию, где находится исходный файл изображения.
Я могу только установить разрешение для каталога "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 - Если у вас нет доступа, проверьте кэш сохраненных закладок и посмотрите, есть ли у вас папка, если таковая есть, активируйте ее. Обратите внимание, что эта проверка предназначена для закладки для содержащейся папки или любой из ее родительских папок в дереве файловой системы.
Используя этот процесс, вы накапливаете доступ к папкам, которые использует ваш пользователь. Вы должны предоставить пользователям способ очистки кеша.
Это не так плохо, как кажется! НТН.