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.
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
@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
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