2013-11-13 1 views
4

У меня есть приложение, которое копирует файлы в буфер обмена. Вот соответствующий код (аргументы в массив 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 иначе, чем я. Я потратил время на обработку документации, и я застрял на этом.

+0

Почта работает в песочнице. Для доступа к скопированным файлам требуется разрешение. «Расширение песочницы» - это разрешение, которое должно быть связано с URL-адресом. Планировочная система должна автоматически передавать это разрешение, но я не знаю, когда автоматическая система работает и не работает. –

+0

My * guess *: Является ли ваше приложение изолированным? Если это так, вы создаете URL-адреса из строк, имеет ли ваше приложение доступ к этим URL-адресам? Если нет, то он не может передавать права доступа, которые он не имеет в Mail (см. Комментарий @ GregParker). – CRD

+0

Приложение - это просто приложение командной строки. Я предполагаю, что они не изолированы. Я не вижу параметр «возможности» в настройках проекта, чтобы даже установить статус «песочницы». – user2976471

ответ

2

Я считаю, что нашел проблему. Похоже, что когда приложения командной строки копируют в картон, есть разрешение, связанное с песочницей, которая не передается. Скопированные файлы можно вставить в любое небезопасное приложение, но не в изолированное приложение. Решение в этом случае состояло в том, чтобы просто создать обычную программу .app для Cocoa.Я до сих пор не знаю, как это сделать, но он копирует файлы таким образом, чтобы разрешения были правильно перенесены, и файл можно вставить в приложениях без песочницы и песочницы.

+0

Я столкнулся с этой проблемой с неподдерживаемым приложением Cocoa, поэтому похоже на использование NSURL для записи в картон, который вы должны сделать из изолированного приложения Cocoa, которое немного смешно, но не совсем не похоже на Apple. –