2012-04-06 4 views
10

Я конвертирую свое приложение Lion для использования Sandbox приложения. Я пытаюсь использовать функцию security-scoped bookmarks, представленную в 10.7.3, чтобы разрешить постоянный доступ к папке. Код, который у меня ниже, возвращает нулевую закладку и выдает следующее сообщение журнала: XPC couldn't look up the Mach service for scoped bookmarks agent.Ошибка создания Security-Scoped Закладка

Я установил User Selected File Access право на Read/Write Access, а также попытался с окружением ..AccessingSecurityScopedResource.

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

NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 
[openPanel setCanChooseFiles:NO]; 
[openPanel setCanChooseDirectories:YES]; 
[openPanel setAllowsMultipleSelection:NO]; 

NSInteger result = [openPanel runModal]; 

if(result == NSFileHandlingPanelCancelButton) { 
    return; 
} 

NSArray *urls = [openPanel URLs]; 

if(urls != nil && [urls count] == 1) { 
    NSURL *url = [urls objectAtIndex:0]; 

    NSData *bookmark = nil; 
    NSError *error = nil; 
    bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
      includingResourceValuesForKeys:nil 
           relativeToURL:nil // Make it app-scoped 
             error:&error]; 
    if (error) { 
     NSLog(@"Error creating bookmark for URL (%@): %@", url, error); 
     [NSApp presentError:error]; 
    } 

    NSLog(@"bookmark: %@", bookmark); 
} 

Update (x3)

Теперь, когда я получил это работает, я могу подтвердить, что звонки на -startAccessingSecurityScopedResource и -stopAccessingSecurityScopedResource не нужны в коде выше, поскольку предоставляет доступ к PowerBox к ресурсу после того, как пользователь выбирает его в NSOpenPanel.

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

+2

Пуска/Стоп вызовы никогда не нужны при создании закладки. У вас уже есть доступ из NSOpenPanel. Закладка сохраняет этот доступ для будущих запусков. И эти будущие прогоны там, где вам нужно будет вызвать startAccessingSecurityScopedResource (по URL-адресу, который вы вернетесь из разрешения закладки). – abarnert

+0

@abarnert Я считаю, что вы правы, так как в опубликованном мной кодеке я использую 'NSOpenPanel', но вам это нужно, если вы создаете закладку из источника, отличного от' NSOpenPanel' или 'NSSavePanel' (например, как создание новой закладки из существующей, чтобы изменить ее область действия). Я обновил свой пост. – Dov

+0

Документация сделала мои глаза кровоточащими, пока я не нашел закладки с защитой от безопасности, и это действительно полезный пример кода. У меня нет возможности создать тег, могу ли я предложить добавить тег «закладка безопасности с защитой»? – Mark

ответ

8

Оказывается, я пропускал решающие права, не перечисленные в пользовательском интерфейсе, но указанные в the documentation:

com.apple.security.files.bookmarks.app-scope 
+2

Спасибо, право было то, что мне нужно для выполнения этой работы. Просто хотел добавить, что я не согласен с вашим обновлением о -startAccessingSecurityScopedResource, не являющемся необходимым; если я прокомментирую это из своего кода, я больше не могу получить доступ к ресурсу. – escrafford

+0

Благодарим за такое решение. Я потратил возрасты, отлаживая мой код, только чтобы узнать, что это право необходимо в Lion (в Mountain Lion это не так). – Nickkk