2012-08-09 30 views
8

Tôi đã xử lý hoạt động kéo từ chế độ xem trình duyệt sang chế độ xem tùy chỉnh. Nó hoạt động tốt trong lepoard tuyết, nhưng không ở trong Mountain Lion có hộp cát.Kéo tập tin đi qua 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]() 

câu hỏi của tôi là:

1.how để sửa chữa __CFPasteboardIssueSandboxExtensionForPath lỗi này, tôi tham khảo các tài liệu và thấy gì về that.I am ensuer rằng tôi có quyền truy cập tệp google nói! có thể là "startAccessingSecurityScopedResource" sẽ giúp tôi, sau đó tôi thử và thất bại

2.why pasteboardItems2 có giá trị? i viết vào pasteboard chỉ url chứ không phải chuỗi. Nó làm tôi kinh ngạc vì tôi có thể nhận được cả url từ loại NSString và NSUrl kiểu! (Tôi thử kéo một tập tin từ iFinder, các url sẽ chỉ tồn tại trong pasteboardItems nhưng không phải là pasteboardItems2) .Bất cứ ai biết tại sao? Tôi nghĩ rằng vấn đề đầu tiên sẽ tự động cố định khi một số giúp tôi khắc phục sự cố này.

+0

Bạn đã tìm ra cách khắc phục sự cố này chưa? Tôi cũng nhận được lỗi này: ( – Aravindhan

+0

@Aravindhanarvi u có thể thử đánh dấu phạm vi –

Trả lời

0

pasteboardItems bạn đọc đối tượng của loại NSString, nhưng bạn kéo một tập tin (với phần mở rộng jpg), bạn nên đăng ký cho loại NSString trong phương pháp init của bạn:

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

đã cố gắng mà không giúp tôi: (... – Aravindhan

1

Tôi tin Apple trả lời câu hỏi 1:

quan trọng: Mặc dù bạn có thể hỗ trợ kéo đường dẫn tập tin, nói chung, bạn nên tránh làm như vậy trừ khi bạn chắc chắn rằng ứng dụng đích sẽ không bao giờ chạy trong hộp cát ứng dụng. Nếu bạn sử dụng NSString, OS X không có cách nào để biết liệu chuỗi đó có nên được hiểu là đường dẫn hay không; do đó, OS X không mở rộng hộp cát của ứng dụng đích thành cho phép truy cập vào tệp hoặc thư mục tại vị trí đó. Thay vào đó, hãy sử dụng NSURL, dấu trang hoặc loại bảng tên tệp.

WRT đến câu hỏi 2, có vẻ như bạn đã dán URL để đọc NSURL đối tượng có vẻ đúng. Tuy nhiên tôi nghĩ rằng bạn nên thực hiện việc kéo sử dụng đoạn mã sau (cũng từ liên kết ở trên):

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

Bạn cần phải generate security-scoped URL bookmark data ở phía người gửi, và turn that data back into a URL về phía người nhận. Có một số thứ khác bạn phải làm sau đó khi bạn muốn thực sự truy cập vào URL; the documentation elaborates.

Ứng dụng nhận, khi chạy trong hộp cát, sẽ không thể xử lý đường dẫn trần. Đây là một phần cốt lõi của việc được sandboxed; bạn không được phép sử dụng đường dẫn trần hoặc URL tương ứng của họ để truy cập các tệp không có trong vùng chứa hộp cát của bạn và chưa được người dùng cấp cho bạn một cách rõ ràng.

+0

mặc dù có nhiều nội dung để làm ... cảm ơn u anyway! –

+0

@AchillesWang bạn có thể sử dụng lớp này để kết thúc sự bền bỉ của một bookmark URL được bảo mật. https://github.com/leighmcculloch/AppSandboxFileAccess –

0

Bạn cần phải có Loại tài liệu được xác định trong ứng dụng của mình để cơ chế sandboxing biết ứng dụng của bạn nên mở tệp bằng các tiện ích đó. Bạn có thể thực hiện việc này bằng cách nhấp vào dự án ở bên trái trong Xcode và trong tab Thông tin, bên dưới Loại tài liệu, hãy thêm loại tài liệu mới cho từng tiện ích mở rộng.

Bạn chỉ cần điền vào trường nameextensions.

Ngoài ra nếu bạn muốn tiếp tục cho phép truy cập các tệp được kéo vào ứng dụng của mình, bạn có thể sử dụng lớp này để kết thúc tất cả logic đó. https://github.com/leighmcculloch/AppSandboxFileAccess

Các vấn đề liên quan