У меня есть приложение, которое копирует файлы в буфер обмена. Вот соответствующий код (аргументы в массив 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];
Однако при тестировании при попытке вставить файл, скопированный в буфер обмена с помощью программы в пустой электронной почты в Mail, часто файл отображается как ноль байт и на консоли появляется следующее сообщение об ошибке:
11/13/13 6: 27: 12,173 AM E-mail [627]: Не удалось получить действительное расширение песочницу для элемента: [789514] аромата: [public.file-url] из картона. 11/13/13 6: 27: 12.174 AM Mail [627]: Не удалось получить расширения песочницы для itemIdentifier (789514). Данные для расширения песочнице был NULL,
, а затем, что сопровождается следующим сообщением об ошибке на консоли:
11/13/13 8: 24: 41,947 А.М. sandboxd [172]: ([627]) E-mail (627) отказать файлы для чтения некоторого атрибут [полный путь к файлу]
что странно, что если скопировать файл из Finder, то он вставит просто отлично без ошибок каждый раз. Другими словами, каким-то образом Finder копирует файл в буфер обмена с различной информацией, чем тот, который я делаю. Чтобы убедиться в этом, я сделал простой AppleScript для возврата информации о буфере обмена. После того, как я скопировать файл в буфер обмена, который возвращает следующее:
{{ «класс свертывать», 115}, { «класс utf8», 115}, { «класс ut16», 232}, {строка, 115}, {текст Unicode, 230}}
После того как я скопировать тот же файл в буфер обмена с помощью Finder, то Applescript возвращает следующее:
{{ «класса свертывать», 33}, {«Класс icns», 795020}, {«класс ut16», 112}, {«класс utf8», 55}, {«класс 8BPS», 1630436}, {«класс BMP», 4194358}, {«класс TPIC» , 1059291}, {Изображение в формате TIFF, 41 97954}, {«класс PNGf», 392648}, {«класс jp2», 213480}, {GIF-изображение, 121307}, {JPEG-изображение, 116181}, {текст в Юникоде, 110}, {строка, 55}}
Так Finder размещает больше информации о файле в буфере обмена и другой информации. Например, класс furl имеет разную длину. Эта дополнительная информация, очевидно, является причиной того, что Mail успешно завершил файл, скопированный с Finder, в то время как у него есть ошибка при вставке файла, скопированного моей программой.
Любые подсказки, какая информация мне не хватает, когда я помещаю файл в буфер обмена или какую дополнительную информацию я должен добавлять в пасту? Я предполагаю, что Finder вставляет не только массив NSURL, но и массив ключей словаря, который включает в себя другую информацию о файле. Кажется, что он создает класс furl иначе, чем я. Я потратил время на обработку документации, и я застрял на этом.
Почта работает в песочнице. Для доступа к скопированным файлам требуется разрешение. «Расширение песочницы» - это разрешение, которое должно быть связано с URL-адресом. Планировочная система должна автоматически передавать это разрешение, но я не знаю, когда автоматическая система работает и не работает. –
My * guess *: Является ли ваше приложение изолированным? Если это так, вы создаете URL-адреса из строк, имеет ли ваше приложение доступ к этим URL-адресам? Если нет, то он не может передавать права доступа, которые он не имеет в Mail (см. Комментарий @ GregParker). – CRD
Приложение - это просто приложение командной строки. Я предполагаю, что они не изолированы. Я не вижу параметр «возможности» в настройках проекта, чтобы даже установить статус «песочницы». – user2976471