2012-08-09 41 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