NSPasteboard: копирование данных обещанного файла в другие изолированные приложения - PullRequest
0 голосов
/ 04 января 2019

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

1 Ответ

0 голосов
/ 04 января 2019

Я не могу найти документацию, где написать обещанный файл, чтобы другие приложения-песочницы могли получить к нему доступ

Это не так.Сначала целевое приложение удаления проверяет, содержат ли типы перетаскивания NSFilesPromisePboardType.

. Если это так, целевое приложение устанавливает местоположение с помощью -[NSDraggingInfo namesOfPromisedFilesDroppedAtDestination:] или PasteboardSetPasteLocation().

. Затем целевое приложение считываетkPasteboardTypeFileURLPromise, который запускает обещанное приложение провайдера файлов для записи его в местоположение, указанное целевым приложением.

Это необходимо сделать в - (void)pasteboard:(nullable NSPasteboard *)pasteboard item:(NSPasteboardItem *)item provideDataForType:(NSPasteboardType)type;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...