2012-08-09 11 views
8

Przetworzyłem operację przeciągania z widoku przeglądarki do widoku niestandardowego. Działa to dobrze w leproardzie śniegu, ale nie w Mountain Lion z piaskownicą.Przeciągnij Pliki napotykają 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]() 

moje pytanie brzmi:

1.how aby naprawić ten błąd __CFPasteboardIssueSandboxExtensionForPath; odnoszę docs i znalazłem nic na temat that.I am ensuer że mam uprawnienia dostępu do pliku google mówi! może być "startAccessingSecurityScopedResource" pomoże mi, a następnie spróbuję i nie powiodło się

2.why pasteboardItems2 mają wartość? Piszę tylko do URL-u, ale nie ciąg tekstowy.Bywiło mnie, że mogę uzyskać adres URL zarówno z NSString i NSUrl rodzaj! (Próbuję przeciągnąć plik z iFinder, adres URL będzie istnieć tylko w pasteboardItems, ale nie w pasteboardItems2). Ktoś wie dlaczego? Myślę, że pierwszy problem zostanie automatycznie naprawiony, gdy ktoś pomoże mi rozwiązać ten problem.

+0

Czy znalazłeś sposób, aby rozwiązać ten problem? Otrzymuję również ten błąd :( – Aravindhan

+0

@Aravindhanarvi możesz spróbować zakładki-zakres –

Odpowiedz

0

Twoje pasteboardItems odczytu obiekt typu NSString, ale wyciągnął plik (z rozszerzeniem jpg), należy zarejestrować się na typ NSString w swojej metodzie Init:

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

próbował, który mi nie pomógł :(... – Aravindhan

1

wierzę Apple odpowiedź na pytanie 1:

Ważne: Chociaż można wspierać przeciągając ścieżki plików, w ogóle, należy unikać tak robi, chyba że jesteś pewien, że aplikacja docelowa nigdy nie będzie uruchamiana w obszarze izolowanym aplikacji. Jeśli używasz NSString, OS X nie ma możliwości sprawdzenia, czy ten ciąg powinien być interpretowany jako ścieżka ; w ten sposób OS X nie rozszerza obszaru piaskownicy aplikacji docelowej do , umożliwiając dostęp do pliku lub katalogu w tej lokalizacji. Zamiast tego należy użyć NSURL, zakładki lub typu pasteboard nazwy pliku.

WRT na pytanie 2, wygląda na to, że wkleiłeś adresy URL, więc czytanie obiektów wydaje się poprawne. Jednak myślę, że należy wdrożyć przeciąganie za pomocą następującego kodu (również z linku powyżej):

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

Trzeba generate security-scoped URL bookmark data po stronie nadawcy i turn that data back into a URL po stronie odbiornika. Jest jeszcze kilka rzeczy, które musisz zrobić później, gdy chcesz uzyskać dostęp do adresu URL; the documentation elaborates.

Aplikacja odbierająca, działająca w piaskownicy, nie będzie w stanie obsłużyć gołych ścieżek. Jest to podstawowa część piaskownicy; nie masz uprawnień do używania gołych ścieżek lub odpowiadających im adresów URL do uzyskiwania dostępu do plików, które nie znajdują się w pojemniku na piaskownicy i nie zostały jawnie przekazane użytkownikowi przez użytkownika.

+0

choć wiele rzeczy do zrobienia ... dziękuję u! –

+0

@AchillesWang można użyć ta klasa, aby zakończyć działanie, utrzymując zakładkę adresu URL o zakresie bezpieczeństwa. https://github.com/leighmcculloch/AppSandboxFileAccess –

0

Musisz zdefiniować typy dokumentów zdefiniowane w aplikacji, aby mechanizm piaskownicy wiedział, że aplikacja powinna otwierać pliki z tymi rozszerzeniami. Możesz to zrobić, klikając projekt po lewej stronie w Xcode, a na karcie Informacje w obszarze Typy dokumentów dodaj nowy typ dokumentu dla każdego rozszerzenia.

Wystarczy wypełnić pole name i extensions.

Jeśli chcesz zachować swoje pozwolenie na dostęp do plików przeciągniętych na aplikację, możesz użyć tej klasy, aby podsumować całą tę logikę. https://github.com/leighmcculloch/AppSandboxFileAccess