С помощью Security-Scoped Bookmark, выбранного пользователем права на чтение и запись и NSOpenPanel я смог читать / писать в выбранную пользователем папку.
Ниже приведены шаги, которым я следовал,
Добавлено
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
в файле прав.
Попросил пользователя выбрать (или создать и выбрать) нужную папку, к которой мое приложение хочет получить доступ (чтение / запись), используя NSOpenPanel.
Когда пользователь выбирает папку, я создал закладку выбранного пути к папке как путь к закладке в NSUserDefaults, используя NSURLBookmarkCreationWithSecurityScope.
NSOpenPanel *openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseDirectories:YES];
[openDlg setCanCreateDirectories:YES];
[openDlg setAllowsMultipleSelection:FALSE];
[openDlg setPrompt:@"Select"];
if ( [openDlg runModal] == NSModalResponseOK )
{
NSURL *url = openDlg.URL;
NSError *error = nil;
NSData *bookmark = [url
bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:nil
error:&error];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:bookmark forKey:@"DOWNLOAD_FOLDER_BOOKMARK_PATH"];
[userDefaults synchronize];
}
После того, как вы сохранили путь в закладках в NSUserDefaults, вы можете получить доступ к сохраненному пути позже, используя NSURLBookmarkResolutionWithSecurityScope.
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSData * bookmarkedPathData = [userDefaults objectForKey:@"DOWNLOAD_FOLDER_BOOKMARK_PATH"];
NSURL* urlFromBookmark = [NSURL URLByResolvingBookmarkData:bookmarkedPathData
options:NSURLBookmarkResolutionWithSecurityScope
relativeToURL:nil
bookmarkDataIsStale:nil
error:&error];
Как только вы получите сохраненный URL-адрес, добавленный в закладки, вы можете использовать этот URL для выполнения операций чтения и записи. Перед чтением / записью с / на URL, пожалуйста, запустите область, используя [urlFromBookmark startAccessingSecurityScopedResource];
. И после завершения операции чтения / записи остановите область, используя [saveFolder stopAccessingSecurityScopedResource];
Примечание: я пытался записывать напрямую в Documents, Downloads, Desktop, не создавая папку внутри этих каталогов, но Apple отклонила приложение, сказав
Ваше приложение имеет доступ к следующим местоположениям «Загрузки».
Затем вместо прямой записи в эти каталоги («Документы», «Загрузки», «Рабочий стол») я попросил пользователя выбрать (создать и выбрать) папку, а затем выполнил операции чтения / записи в выбранной пользователем папке, используя Security-Scope-Bookmark ,
Надеюсь, это кому-нибудь поможет.