Estoy convirtiendo mi aplicación Lion para usar el Sandbox de la aplicación. Estoy tratando de hacer uso de la característica security-scoped bookmarks introducida en 10.7.3 para permitir el acceso persistente a una carpeta. El código que figura a continuación devuelve un marcador nulo y produce el siguiente mensaje de registro: XPC couldn't look up the Mach service for scoped bookmarks agent
.Problema al crear un marcador de ámbito de seguridad
Establecí el derecho User Selected File Access
en Read/Write Access
, y también lo intenté con y sin las llamadas circundantes ..AccessingSecurityScopedResource
.
Creo que estoy haciendo todo bien según la documentación, por lo que agradecería cualquier sugerencia. El código estaba trabajando para recuperar una URL simple antes de que comenzara la aplicación de espacio aislado.
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)
Ahora que tengo trabajo, puedo comprobar que las llamadas a -startAccessingSecurityScopedResource
y -stopAccessingSecurityScopedResource
no son necesarios en el código anterior, ya que el Powerbox concede acceso al recurso después de que el usuario lo selecciona en el NSOpenPanel
.
Si está creando un marcador desde otra URL con ámbito de seguridad, como crear un marcador con un objetivo de un marcador de aplicación creado en otra sesión de la aplicación, primero debe tener acceso al archivo.
el inicio/parada llamadas no son necesarios cuando se hace un marcador. Ya tienes acceso desde NSOpenPanel. El marcador está guardando ese acceso para futuras ejecuciones. Y esas ejecuciones futuras son donde va a necesitar llamar a startAccessingSecurityScopedResource (en la URL que obtiene al resolver el marcador). – abarnert
@abarnert Creo que tienes razón, ya que en el código que publiqué utilizo 'NSOpenPanel', pero lo necesitas si estás creando un marcador de una fuente que no sea' NSOpenPanel' o 'NSSavePanel' (tal como hacer un nuevo marcador de uno existente para cambiar su alcance). He actualizado mi publicación. – Dov
La documentación hizo que mis ojos sangraran hasta que encontré "marcadores de seguridad" y este código de muestra también es útil. No tengo el poder de crear una etiqueta. ¿Puedo sugerir que agreguemos una etiqueta de "marcador de seguridad en el marcador"? – Mark