Создание закладки области безопасности для файла из одного из каталогов, содержащих его

У меня есть закладка области безопасности для каталога, предоставляемого пользователем через запрос openDialog.

Я пытаюсь создать еще одну закладку области безопасности для файла внутри этого каталога:

NSURL *musicFolder = /* Secured URL Resolved from a NSData, bookmark not stale */;

if (![musicFolder startAccessingSecurityScopedResource]) {
    NSLog(@"Error accessing bookmark.");
}

NSString *file = @"myfile.txt"; /* This file exists inside the directory */
NSURL *pathURL = [musicFolder URLByAppendingPathComponent:file];

NSError *systemError;
NSData *bookmarkData = [pathURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
                         includingResourceValuesForKeys:nil
                                          relativeToURL:nil
                                                  error:&systemError];

[musicFolder stopAccessingSecurityScopedResource];

if (!bookmarkData) {
    NSLog(@"%@", systemError);
}

Оба bookmarkData и systemError заканчивают ноль, что не очень полезно...

Поддерживается ли это или вы можете получить действительные закладки с защищенной областью из системы?

Ответ 1

В моей тестовой программе это работает отлично. Я подозреваю, что добавление имени файла в URL-адрес проваливается в вашем случае (но это огромная догадка), потому что это единственное, что кажется существенным другим.

Я заметил, что URL-адрес для безопасности разрешенного места является: Файл://локальный/Users/папа/Desktop/TestFolder applesecurityscope = 343335323030663066393432306234363030346263613464636464643130663635353065373030373b30303030303030303b303030303030303030303030303032303b636f6d2e6170706c652e6170702d73616e64626f782e726561642d77726974653b30303030303030313b30313030303030323b303030303030303030326461363838663b2f75736572732f74796c65722f6465736b746f702f74657374666f6c646572

что является другой причиной, о которой я спрашиваю, является ли проблема с добавлением.

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

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

Кажется, что все нормально.


В моем тесте, где он работает, я получаю путь к файлу следующим образом:

NSURL * resolvedURL = [NSURL URLByResolvingBookmarkData: data
                        options: NSURLBookmarkResolutionWithSecurityScope
                        relativeToURL: nil
                        bookmarkDataIsStale: &isStale
                        error: &error];
... // (error checking)

[resolvedURL startAccessingSecurityScopedResource];

NSArray * files = [[NSFileManager defaultManager] 
                     contentsOfDirectoryAtURL: resolvedURL
                     includingPropertiesForKeys: @[NSURLLocalizedNameKey, NSURLCreationDateKey]
                     options:  NSDirectoryEnumerationSkipsHiddenFiles
                     error: &error];
if ( files != nil )
{
    NSURL * fileURL = [files objectAtIndex: 0]; // hard coded for my quick test
    NSData * newData = [fileURL bookmarkDataWithOptions: NSURLBookmarkCreationWithSecurityScope
                          includingResourceValuesForKeys: nil
                          relativeToURL: nil
                          error: &error];

   if ( newData != nil )
   {
       NSLog(@"it good!");
   }
   .... // error checking and logging.

Если это не поможет вам на правильном пути, мне нужно будет увидеть больше кода (вам, вероятно, нужно будет сделать простой пример).

Обратите внимание, что в моем случае я разрешаю закладку и вызываю startAccessingSecurityScopedResource, даже когда я только что получил url и создал закладку (когда я попытался создать закладку из пути, который я только что приобрел из PowerBox (openPanel ) с ошибкой 256).

Некоторые детали конфигурации: OS X 10.8.4, Xcode 5 (первый публичный выпуск с сегодняшнего дня 18/9/2013).

Ответ 2

После сообщения о проблеме с закладками безопасности и заблокированными файлами это ответ от Apple:

"Кроме того, как вы заметили, для создания закладки с защищенной областью требуется доступ на запись к целевому файлу. Этого больше не должно быть в OS X Mavericks."

Это означало бы, что это ошибка в версии OS X до 10.9.

Ответ 3

Для создания закладок для заблокированных файлов используйте флаг NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess в сочетании с флагом NSURLBookmarkCreationWithSecurityScope в вызове API для создания закладки.

Например:

NSURL* fileURL = [NSURL fileURLWithPath:filePath];
NSError* error = NULL;

NSData* bookmarkData = [fileURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope|NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess includingResourceValuesForKeys:nil relativeToURL:nil error:&error];

Я пробовал это в Mac OS 10.9.5