2012-08-09 14 views
8

Ho elaborato l'operazione di trascinamento dalla visualizzazione del browser alla visualizzazione personalizzata. Funziona bene in snow lepoard, ma non in Mountain Lion con sandbox.Trascinare i file attraverso 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]() 

la mia domanda è:

1.how Per correggere questo errore __CFPasteboardIssueSandboxExtensionForPath; mi riferisco i documenti e ha trovato nulla di that.I am ensuer che ho il permesso per accedere al file Google dice,! potrebbe essere "startAccessingSecurityScopedResource" mi aiuterà, quindi provo e fallito

2. perché pasteboardItems2 hanno valore? io scrivo solo in url ma non in string.It mi fa schifo che posso ottenere l'url sia dal tipo NSString che da NSUrl genere! (Provo a trascinare un file da iFinder, l'url esisterà solo in pasteboardItems ma non in pasteboardItems2). Qualcuno sa perché? Penso che il primo problema verrà risolto automaticamente quando qualcuno mi aiuterà a risolvere questo problema.

+0

Hai trovato il modo di risolvere questo problema? Sto ottenendo anche questo errore :( – Aravindhan

+0

@Aravindhanarvi puoi provare bookmark-scope –

risposta

0

vostri pasteboardItems lettura oggetto di tipo NSString, ma hai trascinato un file (con estensione jpg), è necessario registrarsi per il tipo NSString nel metodo init:

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

provato che non mi ha aiutato :(... – Aravindhan

1

credo Apple risposta domanda 1:

Importante: Anche se è possibile sostenere il trascinamento percorsi dei file, in generale, si dovrebbe evitare di farlo a meno che non si è certi che l'app di destinazione non verrà mai eseguita in una sandbox dell'app. Se si utilizza una NSString, OS X non ha modo di sapere se quella stringa deve essere interpretata come un percorso ; pertanto, OS X non espande la sandbox dell'app di destinazione su e consente l'accesso al file o alla directory in quella posizione. Utilizzare invece un NSURL, un segnalibro o un tipo di file di pastefile.

WRT alla domanda 2, sembra che tu abbia incollato gli URL in modo da leggere gli oggetti NSURL sembra essere corretto. Tuttavia penso che si dovrebbe implementare il trascinamento utilizzando il seguente codice (anche dal link qui sopra):

- (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

È necessario generate security-scoped URL bookmark data sul lato mittente e turn that data back into a URL sul lato ricevente. Ci sono altre cose che devi fare dopo che vuoi effettivamente accedere all'URL; the documentation elaborates.

L'applicazione di ricezione, quando si esegue in una sandbox, non sarà in grado di gestire percorsi nudi. Questa è una parte fondamentale dell'essere in modalità sandbox; non è consentito utilizzare percorsi nudi o i relativi URL per accedere a file che non si trovano nel contenitore sandbox e che non sono stati consegnati esplicitamente all'utente.

+0

anche se molte cose da fare ... grazie comunque! –

+0

@AchillesWang puoi usare questa classe per concludere con un segnalibro URL con ambito di sicurezza persistente https://github.com/leighmcculloch/AppSandboxFileAccess –

0

È necessario definire i tipi di documento nell'applicazione in modo che il meccanismo di sandbox sappia che l'applicazione deve aprire i file con tali estensioni. È possibile farlo facendo clic sul progetto a sinistra in Xcode e, nella scheda Informazioni, in Tipi di documento aggiungere un nuovo tipo di documento per ogni estensione.

Hai solo bisogno di compilare il campo name e extensions.

Inoltre, se si desidera mantenere il permesso per accedere ai file trascinati nella propria applicazione, è possibile utilizzare questa classe per concludere tutta questa logica. https://github.com/leighmcculloch/AppSandboxFileAccess

Problemi correlati