2012-04-06 10 views
10

Konwertuję moją aplikację Lion, aby korzystać z aplikacji Sandbox. Próbuję skorzystać z funkcji security-scoped bookmarks wprowadzonej w 10.7.3, aby umożliwić stały dostęp do folderu. Poniższy kod zwraca zerową zakładkę i generuje następujący komunikat dziennika: XPC couldn't look up the Mach service for scoped bookmarks agent.Problemy z tworzeniem zakładek z zakresem zabezpieczeń

Ustawiłem User Selected File Access uprawnienie do , a także próbowałem zi bez okolicznych połączeń ..AccessingSecurityScopedResource.

Myślę, że robię wszystko zgodnie z dokumentacją, więc doceniam wszelkie wskazówki. Kod działał, aby pobrać zwykły adres URL, zanim zacząłem pracować w piaskownicy.

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)

Teraz mam to działa, mogę sprawdzić, czy połączenia z -startAccessingSecurityScopedResource i -stopAccessingSecurityScopedResource nie są konieczne w powyższym kodzie, ponieważ PowerBox udziela dostępu do zasobu po wybraniu użytkownika w numerze NSOpenPanel.

Jeśli tworzysz zakładkę z innego adresu URL o ograniczonym zakresie zabezpieczeń, na przykład zakładając zakładkę o zakreślonym dokumencie z zakładki o zasięgu aplikacji utworzonej w innej sesji aplikacji, musisz najpierw uzyskać dostęp do tego pliku.

+2

start/stop połączenia nigdy nie są niezbędne przy podejmowaniu zakładkę. Masz już dostęp z NSOpenPanel. Zakładka zapisuje ten dostęp dla przyszłych serii. I te przyszłe biegi będą wymagały wywołania funkcji startAccessingSecurityScopedResource (na adres URL, który otrzymasz od rozwiązania zakładki). – abarnert

+0

@abarnert Wierzę, że masz rację, ponieważ w opublikowanym przeze mnie kodzie używam 'NSOpenPanel', ale potrzebujesz go, jeśli tworzysz zakładkę ze źródła innego niż' NSOpenPanel' lub 'NSSavePanel' (np. jako tworzenie nowej zakładki z istniejącej, aby zmienić jej zakres). Zaktualizowałem swój post. – Dov

+0

Dokumentacja sprawiła, że ​​moje oczy krwawiły, dopóki nie znalazłem "zakładek o zasięgu bezpieczeństwa" i to jest naprawdę pomocny przykładowy kod. Nie mam uprawnień do tworzenia tagów, czy mogę zaproponować dodanie tagu "zakładka o zasięgu bezpieczeństwa"? – Mark

Odpowiedz

8

Okazuje się, że brakowało kluczową uprawnienia, nie wymienione w interfejsie, ale wymienione w the documentation:

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

Dzięki, to było to, czego potrzebowałem, aby wykonać tę pracę. Chciałem tylko dodać, że nie zgadzam się z tym, że twoja aktualizacja dotycząca -startAccessingSecurityScopedResource nie jest konieczna; jeśli skomentuję to z mojego kodu, nie będę już mieć dostępu do zasobu. – escrafford

+0

Dziękuję bardzo za udostępnienie tego rozwiązania. Spędziłem całe wieki na debugowaniu mojego kodu, aby odkryć, że to prawo jest konieczne w Lion (w Mountain Lion nie jest). – Nickkk

Powiązane problemy