拖动文件遇到沙盒(__ CFPasteboardIssueSandboxExtensionForPath)
我处理从浏览器视图拖动操作的自定义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知道为什么吗?我认为当有人帮我解决这个问题时,第一个问题会自动修复。
你pasteboardItems的NSString类型的读取的对象,但你拖着文件(JPG扩展名),你应该在你的init方法的NSString类型注册地:
[self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeString]];
试过,没有帮助我:(... – Aravindhan 2012-08-31 16:52:17
我相信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;
}
您需要generate security-scoped URL bookmark data发送侧和turn that data back into a URL在接收端。在您想要实际访问URL之后,还需要做其他一些事情; the documentation elaborates。
接收应用程序,在沙箱中运行时,将不能够处理裸路径。这是沙盒的核心部分;您不允许使用裸路径或其相应的URL来访问不在您的沙箱容器中并且没有被用户明确提交给您的文件。
虽然它很多东西要做...无论如何谢谢你! – 2012-12-25 07:29:08
@AchillesWang你可以使用这个类来包装持久化的安全范围的URL书签。https://github.com/leighmcculloch/AppSandboxFileAccess – 2013-11-23 14:52:27
您需要在您的应用程序中定义文档类型,以便沙盒机制知道您的应用程序应该使用这些扩展名打开文件。您可以通过单击Xcode左侧的项目来完成此操作,然后在Info选项卡的Document Types下为每个扩展添加一个新的文档类型。
你只需要填写name
和extensions
领域。
此外,如果您想保留访问拖到应用程序上的文件的权限,则可以使用此类来包装所有的逻辑。 https://github.com/leighmcculloch/AppSandboxFileAccess
您是否找到解决此问题的方法?我也越来越这个错误:( – Aravindhan 2012-08-23 14:45:38
@Aravindhanarvi你可以尝试书签范围 – 2012-12-25 07:31:39