Sto sviluppando un'app Mac Store in sandbox che chiede all'utente dove salvare i file scaricati da altrove. Ho questo codice per ottenere la cartella da parte dell'utente (si esclude qualche controllo degli errori):startAccessingSecurityScopedResource non restituisce mai il successo
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;
e quando arriva il momento di spostare un file in questa cartella, ho questo codice:
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];
Quale è un sacco di codice da elencare per dire che startAccessingSecurityScopedResource non restituisce mai il successo per me, immediatamente dopo aver ottenuto l'ULR da NSOpenPanel o in una successiva esecuzione, con i dati del segnalibro salvati in NSUserDefaults.
Nel file diritti, tra le altre cose, ho:
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
C'è qualcosa di sbagliato in questo codice?
Visualizzi messaggi di console? Inoltre, controlla due volte la firma del codice per assicurarti che sia configurato correttamente. – gaige
Nel tuo esempio, non è chiaro da dove viene la matrice 'urls' dopo che il pannello aperto è finito. – gaige
Sono riuscito a modificare la riga ricevendo gli URL quando ho rimosso il controllo degli errori. L'ho rimesso di nuovo. Non ci sono messaggi nella console attorno alla linea che chiama startAccessingSecurityScopedResource. –