Estoy desarrollando una aplicación Sandboxed Mac App Store que le pregunta al usuario dónde guardar los archivos que descarga desde otro lugar. Tengo este código para obtener la carpeta del usuario (excluyendo comprobación de errores):startAccessingSecurityScopedResource nunca devuelve el éxito
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;
y cuando llega el momento de mover un archivo en esta carpeta, tengo este código:
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];
Que es mucho código para listar para decir que startAccessingSecurityScopedResource nunca devuelve éxito para mí, ya sea inmediatamente después de obtener el ULR de NSOpenPanel o en una ejecución posterior, con los datos de marcadores guardados en NSUserDefaults.
En el archivo de prestaciones, entre otras cosas, que tengo:
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
¿Hay algo malo con este código?
¿Estás viendo algún mensaje de la consola? Además, compruebe dos veces la firma del código para asegurarse de que esté configurado correctamente. – gaige
En su ejemplo, no está claro de dónde viene la matriz 'urls' después de que el panel abierto haya finalizado. – gaige
Logré editar la línea obteniendo urls cuando eliminé la comprobación de errores. Lo volví a poner. No hay mensajes en la consola en la línea llamando a startAccessingSecurityScopedResource. –