NSPasteboard: копирование обещанных данных файла в другие изолированные приложения

Мое приложение для 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];
        }
    }
}

Пожалуйста, добавьте к вопросу весь соответствующий код.

Willeke 04.01.2019 13:23

Совет: взгляните на Pasteboard.h.

Willeke 04.01.2019 13:23

Я думаю, вам нужно установитьDataProvider: forTypes: @ [kPasteboardTypeFileURLPromise] ... см. Мой ответ.

catlan 04.01.2019 14:07

"получение файла, записанного в определенном месте на рабочем столе пользователя" rdar: // 33120533

catlan 04.01.2019 16:15
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
464
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

iljawascoding 04.01.2019 15:16

Привет, Катлан! Когда я работаю над копированием пасты с помощью setDataProvider. - (void) pasteboard: (NSPasteboard *, допускающий значение NULL *) элемент pasteboard: (NSPasteboardItem *) item provideDataForType: (NSPasteboardType) type; вызов без нажатия кнопки вставки из MacOS, щелкнув правой кнопкой мыши. Можете ли вы помочь мне в копировании и вставке сенарио.

Rajesh 15.05.2019 17:33

Другие вопросы по теме