8

我处理了从浏览器视图到自定义视图的拖动操作。它在雪豹中运行良好,但在带有沙箱的山狮中运行良好。

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)。有人知道为什么吗?我认为当有人帮我解决这个问题时,第一个问题会自动解决。

4

4 回答 4

1

您需要在发送方生成安全范围的 URL 书签数据,然后在接收方将该数据转换回 URL。之后,当您想要实际访问 URL 时,您还需要做一些其他的事情;文档详细说明

接收应用程序在沙箱中运行时,将无法处理裸路径。这是沙盒化的核心部分;您不得使用裸路径或其对应的 URL 来访问不在您的沙箱容器中且用户未明确交给您的文件。

于 2012-12-18T08:53:39.620 回答
1

我相信Apple回答了问题1:

重要提示:尽管您可以支持拖动文件路径,但一般来说,您应该避免这样做,除非您确定目标应用程序永远不会在应用程序沙箱中运行。如果您使用 NSString,OS X 无法知道该字符串是否应该被解释为路径;因此,OS X 不会扩展目标应用程序的沙箱以允许访问该位置的文件或目录。相反,使用 NSURL、书签或文件名粘贴板类型。

WRT 问题 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;
}
于 2012-11-29T12:56:57.273 回答
0

您需要在应用程序中定义文档类型,以便沙盒机制知道您的应用程序应该打开具有这些扩展名的文件。您可以通过单击 Xcode 左侧的项目来执行此操作,然后在 Info 选项卡中的 Document Types 下为每个扩展添加一个新的文档类型。

您只需要填写nameextensions字段。

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

于 2013-11-23T14:56:33.123 回答
0

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

[self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeString]];
于 2012-08-31T00:44:51.460 回答