Как автоматически сохранить загруженные файлы (аудио, документы) в папку «Загрузки» пользователя в изолированном программном приложении Mac OS X? - PullRequest
0 голосов
/ 11 января 2019

В своем приложении Mac OS X я пытался сохранить загруженные файлы в каталог приложения (т. Е. HomeDirectory () / Documents), но App Store отклонил мое приложение, заявив, что загруженный файл недоступен пользователю легко (т.е. без открытия приложения ). Затем я попытался записать загруженные файлы в папку ~ / Downloads, добавив разрешение на чтение / запись в правах, но App Store снова отклонил приложение, сказав

Ваше приложение имеет доступ к следующим местоположениям:

~ / Скачать

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

Другие распространенные причины этой проблемы:

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

  • запись в вышеуказанное расположение (я) без использования действительного идентификатора приложения в качестве контейнера для записанных файлов.

Теперь проблема заключается в том, что App Store не позволяет мне сохранять файлы ни в каталоге приложения, ни в папке системы (т. Е. Загрузки). Также я не хочу использовать NSSavePanel каждый раз. Я хочу скачать файлы в автоматическом режиме. Где мне сохранить мои файлы?

1 Ответ

0 голосов
/ 28 января 2019

С помощью Security-Scoped Bookmark, выбранного пользователем права на чтение и запись и NSOpenPanel я смог читать / писать в выбранную пользователем папку.

Ниже приведены шаги, которым я следовал,

  1. Добавлено

    <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/>
    

    в файле прав.

  2. Попросил пользователя выбрать (или создать и выбрать) нужную папку, к которой мое приложение хочет получить доступ (чтение / запись), используя NSOpenPanel.

  3. Когда пользователь выбирает папку, я создал закладку выбранного пути к папке как путь к закладке в 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];
    
    }
    
  4. После того, как вы сохранили путь в закладках в 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];
    
  5. Как только вы получите сохраненный URL-адрес, добавленный в закладки, вы можете использовать этот URL для выполнения операций чтения и записи. Перед чтением / записью с / на URL, пожалуйста, запустите область, используя [urlFromBookmark startAccessingSecurityScopedResource];. И после завершения операции чтения / записи остановите область, используя [saveFolder stopAccessingSecurityScopedResource];

Примечание: я пытался записывать напрямую в Documents, Downloads, Desktop, не создавая папку внутри этих каталогов, но Apple отклонила приложение, сказав

Ваше приложение имеет доступ к следующим местоположениям «Загрузки».

Затем вместо прямой записи в эти каталоги («Документы», «Загрузки», «Рабочий стол») я попросил пользователя выбрать (создать и выбрать) папку, а затем выполнил операции чтения / записи в выбранной пользователем папке, используя Security-Scope-Bookmark ,

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...