Идея состоит в том, что у меня есть шаблон файла, который нужно открыть, но он должен вести себя так, как если бы было открыто только содержимое файла, а не сам файл.
Разница для пользователя должна заключаться в том, что ему нужно выбрать место для сохранения файла, а не просто перезаписывать файл, который был открыт.
Аналогичное поведение можно увидеть в приложении предварительного просмотра. При дублировании функции Preview откроет тот же файл в новом окне. После сохранения файла пользователю необходимо указать, куда его сохранить.
Насколько я понимаю, NSWorkspace не поддерживает такое поведение из коробки. Кто-нибудь знает обходной путь для этого? Я бы оценил это!
В моем случае я не знаю, куда пользователь хочет сохранить файл, когда он или она закончили с ним. В настоящее время я копирую файл только в скрытую папку в домашнем каталоге пользователя, а затем открываю копию, чтобы исходный файл нельзя было перезаписать.
В результате получается следующее поведение: - пользователь не видит, где находится файл - при сохранении и закрытии приложения, что файл редактировался, пользователь больше не найдет файл.
Обходной путь: Я думаю, что сейчас я спрошу пользователя, где она хочет сохранить его, прежде чем открывать его, что мне кажется излишним, поскольку вполне может быть, что она не захочет сохранять его. Надеюсь, я скоро найду лучшее решение.
@KenThomases Мое приложение вызывает NSWorkspace.shared.openFile (..) с URL-адресом и соответствующим приложением для открытия этого URL-адреса. Так что ваш ответ именно то, что мне нужно. Я совершенно сбит с толку тем, что после более чем десятилетнего программирования и использования macOS я никогда не замечал и не читал об этой функции канцелярских принадлежностей. : D
Это древняя функция со времен классической Mac OS. Я не нашел современного API для маркировки файла как канцелярской панели. Предположительно, можно было все еще использовать API диспетчера файлов, чтобы установить соответствующий бит во флагах Finder файла. Кроме того, чтобы вы знали, все, что делает система при открытии файла канцелярской подкладки, - это копировать и открывать эту копию. Ты тоже можешь это сделать. Обратите внимание, что приложение не требует, чтобы пользователь указывал местоположение при сохранении, потому что приложение уже связывает документ с существующим файлом (автоматическая копия).
Сначала это звучало многообещающе, но на самом деле это не работает так, как я ожидал. Я уже копирую файл, так что @KenThomases был прав, что особой разницы нет. Тем не менее, примечателен тот факт, что флаг стационарной панели влияет только на прямое взаимодействие пользователей с файлом, например, через Finder. Но при вызове NSWorkspace для открытия файла флаг будет проигнорирован. Так что это не решение моей проблемы, но все же - установка флага через Apple Script описана здесь: apple.stackexchange.com/questions/39490/…
Вы пытаетесь открыть новый документ в определенном известном приложении? Возможно, это может быть сценарий или предоставление службы, которую вы могли бы вызвать.
Это зависит от типа файла и приложения по умолчанию, которое настроено для открытия этого файла. Поэтому я не могу сказать, в каком приложении будет открыт файл.
Мне пришло в голову, что вы могли бы отправить событие Apple «открытое содержимое» ('ocon' / kAEOpenContents) в целевое приложение.
В настоящее время я читаю документацию, так как не могу найти пример отправки события Apple в конкретное приложение. Должен признать, что меня сбивает с толку сложность такой небольшой задачи. Это кажется таким же сложным, как программирование Metal Graphics, только менее хорошо документировано.

Вы можете добиться этого, отправив событие Apple «открытое содержимое» ('ocon' / kAEOpenContents) в целевое приложение. Самый простой способ - это использовать Мост сценариев.
Обычный способ использования Scripting Bridge требует, чтобы вы заранее знали, какое приложение вы хотите настроить, и сгенерировали заголовок Objective-C из определения его интерфейса сценариев. Однако вы должны иметь возможность использовать его "в сыром виде". Например, примерно так:
SBApplication *app = [SBApplication applicationWith...:...]; // there are method to take a PID, a bundle ID, or a URL
[app activate];
NSAppleEventDescriptor *desc = [NSAppleEventDescriptor descriptorWithString:@"foobar"];
[app sendEvent:kCoreEventClass id:kAEOpenContents parameters:keyDirectObject, desc, nil];
Объект NSAppleEventDescriptor - это полезная нагрузка содержимого, в данном случае строка «foobar». Вы можете использовать другие методы для создания различных типов полезных данных. Если вы используете общий и вам нужен тип дескриптора, вы можете посмотреть заголовки в /System/Library/Frameworks/CoreServices.framework/Frameworks/AE.framework/Headers (например, AEDataModel.h или AERegistry.h).
С вашей помощью мне удалось открыть приложение. Большое вам спасибо за это. Перебор все-таки - пример конечно не вызовет открытия нужного контента. К сожалению, я работал над этим часами и не мог понять, как открыть содержимое файлов. Насколько я понимаю, мне нужен дескриптор typeAlias. Но ни одна из моих попыток не сработала. [[NSAppleEventDescriptor descriptorWithFileURL:urls[0]] coerceToDescriptorType:typeAlias];, [[ScriptingBridgeHelper descriptorWithBookmarkDataForFileURL:urls[0]] coerceToDescriptorType:typeAlias];, как описано в другом вопросе о переполнении стека.
Какого типа содержимое файла? Это изображение? Текст? Я думаю, вы хотите прочитать содержимое файла в объекте данных и использовать +descriptorWithDescriptorType:data: с соответствующим типом. Для данных изображения PNG это может повлечь за собой преобразование в данные TIFF и использование, например, typeTIFF. Можете ли вы подтвердить, что если вы перетащите тип данных, которые, как вы ожидаете, будет иметь содержимое вашего файла, из некоторого приложения для редактирования / просмотра на значок приложения, на которое вы рассчитываете настроить таргетинг, приложение откроет новый документ с этим содержимым?
Вы также можете получить тип с помощью NSHFSTypeOfFile() или, со словарем атрибутов файлов, fileHFSTypeCode.
Вы хотите открыть такой новый документ в собственном приложении? Или в другом приложении? Будет ли в вашем приложении инициировано открытое действие? Или другой? Как бы то ни было, в ОС есть встроенная поддержка чего-то вроде того, что вы описываете. См. Флажок «Блокнот для канцелярских принадлежностей» в окне «Получить информацию» для файла в Finder.