复制到剪贴板的文件为空,粘贴时"丢失沙盒扩展"

use*_*471 6 macos cocoa objective-c appkit osx-mavericks

我有一个将文件复制到剪贴板的应用程序.以下是相关代码(参数是包含文件路径的NSStrings数组):

NSMutableArray *filesToCopy = [[NSMutableArray alloc] init];        
int i;
for (i=1; i < [arguments count]; i++) {
    NSString* pathToFile = [arguments objectAtIndex:i];
    NSURL* fileURL = [[NSURL alloc] initFileURLWithPath:pathToFile];
    [filesToCopy addObject:fileURL];
}

NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
NSInteger changeCount = [pasteboard clearContents];
BOOL OK = [pasteboard writeObjects:filesToCopy];
Run Code Online (Sandbox Code Playgroud)

但是,在尝试将程序复制到剪贴板的文件粘贴到Mail中的空电子邮件时进行测试时,通常该文件显示为零字节,并且控制台上显示以下错误:

11/13/13 6:27:12.173 AM邮件[627]:无法从粘贴板获取有效的项目:[789514]:[public.file-url]的沙箱扩展名.11/13/13 6:27:12.174 AM邮件[627]:无法获得itemIdentifier(789514)的沙箱扩展.沙箱扩展的数据为NULL

然后在控制台上出现以下错误:

11/13/13 8:24:41.947 AM sandboxd [172] :( [627])邮件(627)拒绝file-read-xattr [文件的完整路径]

奇怪的是,如果我从Finder复制文件,那么每次粘贴都没有错误.换句话说,Finder以某种方式将文件复制到剪贴板,其信息与我的方式不同.为了验证这一点,我做了一个简单的AppleScript来返回剪贴板信息.将文件复制到剪贴板后返回以下内容:

{{«class furl»,115},{«class utf8»,115},{«class ut16»,232},{string,115},{Unicode text,230}}

使用Finder将同一文件复制到剪贴板后,Applescript将返回以下内容:

{{«class furl»,33},{«class icns»,795020},{«class ut16»,112},{«class utf8»,55},{«class 8BPS»,1630436},{«class BMP »,4194358},{«class TPIC»,1059291},{TIFF picture,4197954},{«class PNGf»,392648},{«class jp2»,213480},{GIF picture,121307},{JPEG picture, 116181},{Unicode text,110},{string,55}}

因此,Finder会在剪贴板上提供有关该文件的更多信息以及不同的信息.例如,furl类具有不同的长度.这些额外的信息显然是什么原因导致Mail成功通过从Finder复制的文件,同时它粘贴了我的程序复制的文件时出错.

当我将文件放在剪贴板上或者我应该向粘贴添加哪些额外信息时,我丢失了哪些信息的线索?我猜测Finder不只是粘贴一个NSURL数组,而是一个包含其他文件信息的字典键数组.它似乎也创造了与我不同的furl类.我花了很多时间倾注文档,我坚持这个.

use*_*471 2

我相信我发现了问题。似乎当命令行应用程序复制到粘贴板时,有一个与沙箱相关的权限未传输。复制的文件可以很好地粘贴到任何非沙盒应用程序中,但不能粘贴到沙盒应用程序中。本例中的解决方案是创建一个常规的基于 Cocoa 的 .app 程序。我仍然不确定如何,但它以正确传输权限的方式复制文件,并且文件可以粘贴到非沙盒和沙盒应用程序中。