拖拽文件遇到 Sandbox(__CFPasteboardIssueSandboxExtensionForPath) 问题

8

我在浏览器视图中处理了拖放操作,将其拖到自定义视图中。它在雪豹系统中运行良好,但在带有沙盒的Mountain Lion系统中却无法正常工作。

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.如何修复此错误 __CFPasteboardIssueSandboxExtensionForPath;我查阅了文档,但找不到有关此错误的说明。我确定我有访问该文件的权限!谷歌说,“startAccessingSecurityScopedResource”可能会帮助我,然后我尝试了但失败了。

2.为什么pasteboardItems2有值?我只将url写入粘贴板而没有字符串。我感到困惑的是,我可以从NSString类型和NSUrl类型中都获取URL!(我尝试从iFinder拖动文件,URL只存在于pasteboardItems中而不是pasteboardItems2)。有人知道原因吗?我认为第一个问题在有��帮我解决这个问题之后会自动解决。


你找到解决这个问题的方法了吗?我也遇到了这个错误 :( - Aravindhan
@Aravindhanarvi 你可以尝试使用书签范围。 - Achilles Wang
4个回答

1

我认为苹果回答了问题1:

重要提示:虽然您可以支持拖放文件路径,但通常情况下,除非您确定目标应用程序永远不会在应用程序沙盒中运行,否则应避免这样做。如果使用NSString,则OS X无法知道该字符串是否应解释为路径;因此,OS X不会扩展目标应用程序的沙盒以允许访问该位置处的文件或目录。相反,请使用NSURL、书签或文件名剪贴板类型。

关于问题2,看起来您已经粘贴了URL,因此读取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

@AchillesWang 你可以使用这个类来封装持久化安全范围URL书签。https://github.com/leighmcculloch/AppSandboxFileAccess - Leigh McCulloch

0

你的pasteboardItems读取了NSString类型的对象,但是你拖动了一个带有jpg扩展名的文件,你应该在你的init方法中注册NSString类型:

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

0

你需要在应用程序中定义文档类型,以便沙盒机制知道你的应用程序应该打开具有这些扩展名的文件。您可以通过在 Xcode 中左侧单击项目,在“信息”选项卡下添加新的文档类型来完成此操作。

您只需要填写nameextensions字段即可。

此外,如果您希望保留对拖放到应用程序上的文件的访问权限,则可以使用此类来封装所有逻辑。 https://github.com/leighmcculloch/AppSandboxFileAccess


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接