2012-04-06 12 views
10

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.

+2

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

+0

@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

+0

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

Respuesta

8

Resulta que me estaba perdiendo un derecho fundamental, que no figura en la interfaz de usuario, pero que figuran en the documentation:

com.apple.security.files.bookmarks.app-scope 
+2

Gracias, el derecho era lo que necesitaba para que esto funcionara. Solo quería agregar que no estoy de acuerdo con su actualización acerca de que -startAccessingSecurityScopedResource no es necesario; si comento esto fuera de mi código, ya no puedo tener acceso al recurso. – escrafford

+0

Muchas gracias por compartir esta solución. Pasé años depurando mi código solo para descubrir que este derecho es necesario en Lion (en Mountain Lion no lo es). – Nickkk

Cuestiones relacionadas