2012-06-05 17 views
5

Zajmuję się tworzeniem aplikacji piaskownicy Mac App Store, która pyta użytkownika, gdzie zapisać pliki pobrane z innych źródeł. Mam ten kod, aby uzyskać folder z użytkownikiem (stripping się jakiś sprawdzanie błędów):StartAccessingSecopedScopedResource nigdy nie zwraca sukcesu

NSOpenPanel* openPanel = [NSOpenPanel openPanel]; 
[openPanel setAllowsMultipleSelection:NO]; 
[openPanel setCanChooseDirectories:YES]; 
[openPanel setResolvesAliases:YES]; 
NSInteger result = [openPanel runModal]; 
NSArray* urls = [openPanel URLs]; 
NSURL* folderURL = [urls objectAtIndex:0]; 
NSError* error; 
NSData* bookmakeData = [folderURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
          includingResourceValuesForKeys:nil 
              relativeToURL:nil 
                error:&error]; 
_saveFolderBookmark = bookmakeData; 

a gdy przychodzi czas, aby przenieść plik do tego folderu, mam ten kod:

BOOL isStale; 
NSError* error; 
NSURL* saveFolder = [NSURL URLByResolvingBookmarkData:_saveFolderBookmark 
               options:NSURLBookmarkCreationWithSecurityScope 
             relativeToURL:nil 
            bookmarkDataIsStale:&isStale 
               error:&error]; 
BOOL success = [saveFolder startAccessingSecurityScopedResource]; 

// Move the file somewhere else 
NSWorkspace* workspace = [NSWorkspace sharedWorkspace]; 
NSInteger operationTag; 
BOOL copied = [workspace performFileOperation:NSWorkspaceMoveOperation 
             source:[[self getDocumentsFolder] path] 
            destination:[saveFolder path] 
             files:[NSArray arrayWithObject:filename] 
              tag:&operationTag]; 
[saveFolder stopAccessingSecurityScopedResource]; 

Które jest dużo kodu do listy, aby powiedzieć, że startAccessingSecurityScopedResource nigdy nie zwraca sukcesu dla mnie, albo natychmiast po uzyskaniu ULR z NSOpenPanel lub w późniejszym uruchomieniu, z danymi zakładki są zapisywane w NSUserDefaults.

W pliku uprawnienia, między innymi, mam:

<key>com.apple.security.files.bookmarks.app-scope</key> 
<true/> 

Czy jest coś nie tak z tym kodem?

+0

Czy widzisz jakieś komunikaty konsoli? Należy również dokładnie sprawdzić podpisywanie kodu, aby upewnić się, że jest poprawnie skonfigurowany. – gaige

+0

W twoim przykładzie nie jest jasne, skąd pochodzi tablica 'urls' po zakończeniu otwartego panelu. – gaige

+0

Udało mi się wyedytować wiersz uzyskiwania adresów URL po usunięciu sprawdzania błędów. Znowu go włożyłem. W konsoli nie ma żadnych komunikatów dotyczących wywoływania linii startAccessingSecurityScopedResource. –

Odpowiedz

8

Ten jest bardzo łatwy. Rozpoznajesz w NSURLBookmarkCreationWithSecurityScope zamiast NSURLBookmarkResolutionWithSecurityScope. Po prostu zmień tę linię i powinna działać.

(Może nie działać podczas tej samej sesji, w której utworzysz zakładkę, gdy masz już dostęp do adresu URL, ponieważ nie powinieneś w tym przypadku go wywoływać, ale w późniejszych seriach powinna oczywiście , ponieważ o to chodzi.)

+0

Bardzo oczywiste teraz, kiedy to zostało wskazane. Zastanawiasz się, dlaczego istnieją dwie różne stałe. Dzięki! –

+2

Jeśli spojrzeć na historię, ma to sens. Pierwotny zestaw flag BookmarkCreation i BookmarkResolution w wersji 10.6 nie zawierał ładnie dopasowanych par, więc były to całkowicie niezależne zestawy wartości bitmask i nie było możliwości pomylenia między np. NSURLBookmarkCreationMinimalBookmark a NSURLBookmarkResolutionWithoutUI. Ale byłoby miło, gdyby dodali jakiś sposób, żeby kompilator ostrzegał cię o tym, prawda? – abarnert

0

Prawidłowe rozwiązanie zostało podane powyżej, ale pomyślałem, że dodam kolejną możliwość dla tych, którzy mają ten sam symptom (startAccessingSecurityScopedResource nigdy nie wraca YES). Upewnij się, że używasz rzeczywistego adresu URL zwróconego przez Powerbox, który może (prawdopodobnie będzie) inny niż adres URL rzeczywistego zasobu, do którego próbujesz uzyskać dostęp. Na przykład Powerbox zwróci adres URL do ścieżki, którą użyjesz z startAccessingSecurityScopedResource, aby uzyskać dostęp do określonego pliku znajdującego się pod tym katalogiem.

Powiązane problemy