objective-c - 复制到剪贴板的文件为空,粘贴时为 "Missing Sandbox Extension"

标签 objective-c macos cocoa osx-mavericks appkit

我有一个正在将文件复制到剪贴板的应用程序。这是相关代码(参数是包含文件路径的 NSString 数组):

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];

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

11/13/13 6:27:12.173 AM Mail[627]: Failed to obtain a valid sandbox extension for item: [789514] of flavor: [public.file-url] from the pasteboard. 11/13/13 6:27:12.174 AM Mail[627]: Failed to get a sandbox extensions for itemIdentifier (789514). The data for the sandbox extension was NULL

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

11/13/13 8:24:41.947 AM sandboxd[172]: ([627]) Mail(627) deny file-read-xattr [full path of file]

奇怪的是,如果我从 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 类。我花了很多时间编写文档,但我一直停留在这个文档上。

最佳答案

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

关于objective-c - 复制到剪贴板的文件为空,粘贴时为 "Missing Sandbox Extension",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19956507/

相关文章:

将 Macos 升级到 Big Sur(v11.0.1) 后,Java 无法正常运行

macos - 使用 AppleScript 对文件/文件夹设置注释

objective-c - 获取一个对象的内存地址为long/long long?

iphone - MKPinAnnotationView 上未显示 rightCalloutAccessoryView

iphone - 如何以编程方式闪烁屏幕?

iphone - 为什么我的应用程序崩溃了? UITable 和 Controller

objective-c - 如何将所有错误(包括未捕获的异常、NSLog 调用和其他日志)重定向到 Mac OS X 上的日志文件?

iOS编程如何在用户点击ImageView时全屏显示图像

ios - 是否有 API 或其他方法可以与 Mac OS X 和 iOS(iPhone 和 iPad)通信?

ios - 滚动曲线路径