2012-08-09 58 views
8

我處理從瀏覽器視圖拖動操作的自定義view.It雪lepoard工作得很好,但不是在山獅與沙箱。拖動文件遇到沙盒(__ 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]() 

我的問題是:

1.how修復此錯誤__CFPasteboardIssueSandboxExtensionForPath;我指的文檔,並沒有發現任何關於that.I上午ensuer,我要訪問該文件的權限谷歌說,!可能是「startAccessingSecurityScopedResource」將幫助我,然後我嘗試和失敗

2.爲什麼pasteboardItems2有價值嗎?我只寫信給粘貼板只有url而不是string.It反感我可以從NSString類型和NSUrl類型! (我試着拖動從iFinder文件,URL將只在pasteboardItems存在,但不pasteboardItems2).Anybody知道爲什麼嗎?我認爲當有人幫我解決這個問題時,第一個問題會自動修復。

+0

您是否找到解決此問題的方法?我也越來越這個錯誤:( – Aravindhan 2012-08-23 14:45:38

+0

@Aravindhanarvi你可以嘗試書籤範圍 – 2012-12-25 07:31:39

回答

0

pasteboardItems的NSString類型的讀取的對象,但你拖着文件(JPG擴展名),你應該在你的init方法的NSString類型註冊地:

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

試過,沒有幫助我:(... – Aravindhan 2012-08-31 16:52:17

1

我相信Apple回答問題1:

重要:雖然可以支持拖動文件路徑,一般來說, 你應該避免這樣做,除非你確信目標 應用永遠不會在應用沙箱中運行。如果你使用一個NSString,OS X 沒有辦法知道字符串是否應被解釋爲 路徑;因此,OS X不擴大目標應用程序的沙箱 允許訪問該位置的文件或目錄。相反,請使用 NSURL,書籤或文件夾粘貼板類型。

WRT問題2,它看起來像您粘貼的網址,以便閱讀NSURL對象似乎是正確的。不過,我想你應該使用下面的代碼(也從上面的鏈接)實現拖動:

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

您需要generate security-scoped URL bookmark data發送側和turn that data back into a URL在接收端。在您想要實際訪問URL之後,還需要做其他一些事情; the documentation elaborates

接收應用程序,在沙箱中運行時,將不能夠處理裸路徑。這是沙盒的核心部分;您不允許使用裸路徑或其相應的URL來訪問不在您的沙箱容器中並且沒有被用戶明確提交給您的文件。

+0

雖然它很多東西要做...無論如何謝謝你! – 2012-12-25 07:29:08

+0

@AchillesWang你可以使用這個類來包裝持久化的安全範圍的URL書籤。https://github.com/leighmcculloch/AppSandboxFileAccess – 2013-11-23 14:52:27

0

您需要在您的應用程序中定義文檔類型,以便沙盒機制知道您的應用程序應該使用這些擴展名打開文件。您可以通過單擊Xco​​de左側的項目來完成此操作,然後在Info選項卡的Document Types下爲每個擴展添加一個新的文檔類型。

你只需要填寫nameextensions領域。

此外,如果您想保留訪問拖到應用程序上的文件的權限,則可以使用此類來包裝所有的邏輯。 https://github.com/leighmcculloch/AppSandboxFileAccess