2012-08-09 11 views
8

Procesé la operación de arrastre desde la vista del navegador a la vista personalizada. Funciona bien en snow lepoard, pero no en Mountain Lion con sandbox.Los archivos de arrastre aparecen en Sandbox (__ CFPasteboardIssueSandboxExtensionForPath)

in browser view: 
    NSMutableArray* urls = [[[NSMutableArray alloc] init] autorelease]; 
..............put some NSUrl to urls array.................... 
    [pasteboard writeObjects:[NSArray arrayWithArray:urls]]; 

in my receive custom view: 
    NSArray* pasteboardItems = [pasteboard readObjectsForClasses:[NSArray arrayWithObject:[NSString class]] options:nil]; 
    NSArray* pasteboardItems2 = [pasteboard readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] options:nil]; 
    NSArray* pasteboardItems3 = [pasteboard readObjectsForClasses:[NSArray arrayWithObject:[NSImage class]] options:nil]; 
    NSLog(@"%@",pasteboardItems); 
    NSLog(@"%@",pasteboardItems2); 
    NSLog(@"%@",pasteboardItems3); 
my log is: 
    2012-08-09 18:33:43.886 iCollage[6885:303] __CFPasteboardIssueSandboxExtensionForPath: error for [/Users/xxxx/Library/Containers/xxxxxxxxxxxx/Data/Downloads/1343902069.jpg] 
    2012-08-09 18:33:44.546 iCollage[6885:303] ("file://localhost/Users/xxx/Library/Containers/xxxxxxxx/Data/Downloads/1343902069.jpg") 
    2012-08-09 18:33:44.547 iCollage[6885:303] ("file://localhost/Users/xxxxx/Library/Containers/xxxxxx/Data/Downloads/1343902069.jpg") 
    2012-08-09 18:33:44.547 iCollage[6885:303]() 

mi pregunta es:

1.how para solucionar este error __CFPasteboardIssueSandboxExtensionForPath; me refiero a los documentos y no encontré nada sobre that.I am ensuer que tengo el permiso para acceder al archivo de Google dice! puede ser "startAccessingSecurityScopedResource" me ayudará, entonces lo intento y falló

2.why pasteboardItems2 tiene valor? escribo solo en la url de la cartulina pero no en la cadena. Me disgustó que pueda obtener la url tanto del tipo NSSr como del NSUrl ¡tipo! (Intento arrastrar un archivo desde iFinder, la URL solo existirá en pasteboardItems pero no en pasteboardItems2). ¿Alguien sabe por qué? Creo que el primer problema se solucionará automáticamente cuando alguien me ayude a solucionar este problema.

+0

¿Ha encontrado la manera de solucionar este problema? También estoy obteniendo este error :( – Aravindhan

+0

@Aravindhanarvi puedes intentar marcar el alcance –

Respuesta

0

Sus pasteboardItems lectura objeto de tipo NSString, pero que ha arrastrado un archivo (con extensión jpg), deberá registrarse en el tipo NSString en su método init:

[self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeString]]; 
+0

intenté que no me ayudó :(... – Aravindhan

1

creo pregunta Apple Respuesta 1:

Importante: Aunque se puede apoyar arrastrando las rutas de archivos, en general, se debe evitar haciendo así que a menos que esté seguro de que la aplicación de destino nunca se ejecutará en un arenero de la aplicación. Si utiliza un NSString, OS X no tiene forma de saber si esa cadena debe interpretarse como una ruta ; por lo tanto, OS X no expande la zona de pruebas de la aplicación de destino a para permitir el acceso al archivo o directorio en esa ubicación. En su lugar, use un NSURL, un marcador o un tipo de archivo de tipo de carpeta.

WRT a la pregunta 2, parece que ha pegado las URL para que la lectura de los objetos NSURL parezca correcta. Sin embargo, creo que debe aplicar el arrastre mediante el siguiente código (también desde el siguiente enlace):

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender 
{ 
    NSPasteboard *pboard = [sender draggingPasteboard]; 

    if ([[pboard types] containsObject:NSFilenamesPboardType]) { 
     NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; 
     int numberOfFiles = [files count]; 
     // Perform operation using the list of files 
    } 
    return YES; 
} 
1

Es necesario generate security-scoped URL bookmark data en el lado emisor y turn that data back into a URL en el lado receptor. Hay algunas otras cosas que debes hacer después cuando quieras acceder a la URL; the documentation elaborates.

La aplicación de recepción, cuando se ejecuta en un sandbox, no podrá manejar rutas de acceso desprotegidas. Esta es una parte central de ser sandboxed; no se le permite usar rutas de acceso desprotegidas o sus URL correspondientes para acceder a los archivos que no están en su contenedor de espacio aislado y que el usuario no le ha entregado explícitamente.

+0

aunque hay muchas cosas que hacer ... ¡gracias de todos modos! –

+0

@AchillesWang puedes usar esta clase para finalizar persistiendo un marcador de URL de ámbito de seguridad. https://github.com/leighmcculloch/AppSandboxFileAccess –

0

Debe tener Tipos de documentos definidos en su aplicación para que el mecanismo de espacio aislado sepa que su aplicación debe abrir archivos con esas extensiones. Puede hacerlo haciendo clic en el proyecto de la izquierda en Xcode, y en la pestaña Información, en Tipos de documentos, agregue un nuevo tipo de documento para cada extensión.

Solo tiene que rellenar el campo name y extensions.

Además, si quieres que persista su permiso para acceder a los archivos arrastrados en su aplicación, puede utilizar esta clase para terminar todo lo que la lógica. https://github.com/leighmcculloch/AppSandboxFileAccess

Cuestiones relacionadas