Мое приложение для Mac в песочнице помещает данные изображения как данные «public.jpeg», а также kPasteboardTypeFilePromiseContent на монтажный стол.
Путь, используемый для обещанного файла, находится где-то в папке контейнера моего изолированного приложения.
Это отлично работает, позволяя перетаскивать в Finder, но, похоже, вызывает проблемы с другими изолированными приложениями, которые отдают приоритет обещанным данным файла над данными изображения, например Приложение Apple Pages.
Я не могу найти документацию, где записать обещанный файл, чтобы другие изолированные приложения могли получить к нему доступ. Любые намеки приветствуются.
NSURL *url = [NSURL fileURLWithPath:self.libraryImage.filePath];
if (url)
{
[pasteboardItem setDataProvider:dataProvider
forTypes:@[(NSString *)kPasteboardTypeFilePromiseContent]];
}
Обновлять:
У меня что-то работает, используя расширение NSPasteBoard, размещенное здесь: https://stackoverflow.com/a/18561956/581784
Единственное, чего не хватает, - это записи файла в определенное место на рабочем столе пользователя, где завершилось перетаскивание. Мой текущий код выглядит так:
- (void)pasteboard:(nullable NSPasteboard *)pasteboard item:(NSPasteboardItem *)item provideDataForType:(NSString* /* NSPasteboardType */)type
{
if ([type isEqualToString:(NSString *)kPasteboardTypeFileURLPromise])
{
NSURL *pasteURL = [pasteboard pasteLocation];
if (pasteURL) {
NSString *listingImageUUID = [item stringForType:kGSListingImageUUIDPasteboardType];
GSListingImage *listingImage = (GSListingImage*) [[[GSAppDelegate appDelegate] mainDatabaseContext] objectWithUUID:listingImageUUID ofClass:GSListingImage.class];
NSString *imageName = [listingImage.libraryImage.filePath lastPathComponent];
NSURL *destURL = [pasteURL URLByAppendingPathComponent:imageName];
[[listingImage.libraryImage jpegData] writeToURL:destURL
atomically:YES];
[pasteboard setPasteLocation:destURL];
}
}
}
Совет: взгляните на Pasteboard.h.
Я думаю, вам нужно установитьDataProvider: forTypes: @ [kPasteboardTypeFileURLPromise] ... см. Мой ответ.
"получение файла, записанного в определенном месте на рабочем столе пользователя" rdar: // 33120533

I cannot find documentation where to write the promised file so other sandboxed apps can access it
Это не так. Целевое приложение перетаскивания сначала проверяет, содержат ли типы перетаскивания NSFilesPromisePboardType.
В таком случае целевое приложение устанавливает местоположение с помощью -[NSDraggingInfo namesOfPromisedFilesDroppedAtDestination:] или PasteboardSetPasteLocation().
Затем целевое приложение считывает kPasteboardTypeFileURLPromise, который запускает обещанное приложение поставщика файлов, чтобы записать его в место, указанное целевым приложением.
Сделать это нужно в - (void)pasteboard:(nullable NSPasteboard *)pasteboard item:(NSPasteboardItem *)item provideDataForType:(NSPasteboardType)type;.
Спасибо, у меня что-то работает, используя расширение NSPasteboard, размещенное здесь: stackoverflow.com/a/18561956/581784
Привет, Катлан! Когда я работаю над копированием пасты с помощью setDataProvider. - (void) pasteboard: (NSPasteboard *, допускающий значение NULL *) элемент pasteboard: (NSPasteboardItem *) item provideDataForType: (NSPasteboardType) type; вызов без нажатия кнопки вставки из MacOS, щелкнув правой кнопкой мыши. Можете ли вы помочь мне в копировании и вставке сенарио.
Пожалуйста, добавьте к вопросу весь соответствующий код.