При сосуществовании устаревших и современных приложений Mac невозможно глобально связать связанные документы с современным приложением (Launch Services?)

Обновлено 9.04.2013 Это полный репост моего предыдущего вопроса. Поскольку я узнал гораздо больше о Launch Services, UTI и устаревших кодах создателя, я чувствую, что могу лучше задать вопрос с нуля.

Описание проблемы:

У нас есть приложение, разработанное для Legacy Mac 9.xx, которое все еще работает на Snow Leopard (с Rosetta). Приложение использует связанные файлы. Мы разработали наше новое приложение для Snow Leopard и не только. Проблема в том, что Launch Services неправильно связывает новое приложение на основе конфигурации plist, которую мы в настоящее время используем, и мне нужно знать, что я делаю неправильно.

Если я щелкну правой кнопкой мыши связанный документ и выберу GetInfo, я могу связать связанный файл либо с устаревшим приложением, либо с новым приложением, и оно будет работать так, как я ожидал. Я считаю, что это потому, что снежный барс все еще использовал технологию кода создателя для этого типа ассоциации. Если я скажу файлу связать себя со старым устаревшим приложением и нажму «Изменить все», Launch Services правильно свяжет все файлы этого типа, и он будет работать должным образом. Если я скажу файлу связать себя с новым приложением и выберу «Изменить все», приложение откроется, а файлы - нет. Насколько я могу судить, службы запуска назначают динамический UTI для приложения, и когда файл щелкается, ОС не знает, какое приложение использовать.

Я нашел там пару сообщений, которые, кажется, предполагают, что Apple, возможно, допустила некоторые дизайнерские ошибки в новой методологии UTI. В одном сообщении показано, как добавить массив расширений строковых файлов в словарь ExportedUTIs новых приложений pList. Это заставит приложение работать правильно, но это не решит проблему; Если мы позволим нашим пользователям называть свои файлы как угодно, мы не сможем предсказать в массиве, каким будет расширение их файлов. Нам нужны службы запуска, чтобы правильно работать строго с кодом UTI или каким-то образом заставить код OSType работать.

Сообщение об ИМП

Как только новое приложение решит, что не может открыть связанный с ним файл, мне нужно открыть LanchServices.plist, удалить запись и перезапустить базу данных lsregister. Затем я снова могу открыть файл в новом приложении (связав его, не нажимая «Изменить все»).

Я прикрепляю несколько изображений к спискам приложений, прилагаемым спискам документов и записи Launch Services:

Старый список приложений

Новый список приложений

plist из объединенного документа

Запись служб запуска для нового приложения

Любая помощь и наше руководство очень ценится.

Майк

Обновлено: 16.04.2013

Ссылка на сообщение об UTI, которое я предоставил, также включает ссылку на приложение с открытым исходным кодом под названием RCDefault app. Это приложение свяжет ваше приложение с данным файлом на основе вашего выбора UTI, расширений файлов, кодов OSType и типов файлов. Как ни странно, это приложение может связать файл с приложением на основе структуры UTI, представленной в наших списках.

Возможно ли, что это всего лишь ошибка в Launch Services for Snow Leopard для этого конкретного сценария, и Apple решила просто проигнорировать ее на данном этапе (учитывая, что они больше не поддерживают Snow)?


person Miek    schedule 13.03.2013    source источник
comment
Все ли эти шаги необходимы для воспроизведения проблемы? Есть ли у вас рабочий способ открытия файла в новой версии приложения?   -  person paulmelnikow    schedule 14.03.2013
comment
Да, если я свяжу с новым приложением только один файл, он откроется. Проблема возникает только тогда, когда я пытаюсь установить ассоциацию для всех подобных файлов. Как только проблема возникает, я могу отменить ее, только удалив файл com.apple.launchsercives.plist в каталоге / Users / Library / Preferences. Я считаю, что этот файл не обновляется, если не выбран вариант «Изменить все».   -  person Miek    schedule 14.03.2013
comment
Хорошо. Не могли бы вы прояснить вопрос, что происходит, когда вы пытаетесь открыть файл через Finder? Вы упоминаете перетаскивание, но я не уверен, что понимаю, при чем здесь validateDrop. Идентичны ли типы файлов в двух приложениях?   -  person paulmelnikow    schedule 14.03.2013
comment
@noa Независимо от того, перетаскивают ли файл в приложение NSOutlineView, или дважды щелкают по нему, или я использую средство поиска и дважды щелкаю файл, поведение все равно; проблема возникает только тогда, когда com.apple.launchservices.plist добавляет приложение (глобальную ассоциацию) в свой файл. Если ассоциация не глобальная (только для этого файла), то файл launchservices.plist не редактируется системой и все работает как надо.   -  person Miek    schedule 14.03.2013
comment
Идентичны ли типы файлов в информационных листах двух приложений?   -  person paulmelnikow    schedule 14.03.2013


Ответы (2)


Вам не хватает CFBundleTypeExtensions. Создайте CFBundleTypeExtensions типа Array, и Item 0 должен быть расширением вашего файла.

Вам также не хватает CFBundleTypeName, который является типом псевдонима, который будет использовать файл. Делает это красивым и красивым. :)

Ссылка (CFBundleDocumentTypes): https://developer.apple.com/library/mac/#documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html

person Derek    schedule 12.04.2013
comment
Где мне создать CFBundeledTypeExtensions и CFBundeledTypeName? в прилагаемом файле или приложении? Если приложение, в какой области? - person Miek; 13.04.2013
comment
В информационном листе в разделе «Документы». Самый быстрый способ понять, что я имею в виду, - создать новое приложение на основе документов и сравнить его с вашим списком. - person Derek; 14.04.2013
comment
Я понимаю, что вы имеете в виду, но это не имеет значения. Единственный способ заставить приложение правильно связать себя с Launch Services - это добавить массив расширений файлов в раздел UTI экспортированных типов (имена Xcode) в директории Equivalent Types, что, по иронии судьбы, вовсе не является UTI. Как я уже говорил ранее, это никуда не годится. Спасибо за ссылку на ссылку на ключи. Я все еще изучаю это. - person Miek; 15.04.2013

Прошло некоторое время с тех пор, как я изначально опубликовал это, но на всякий случай, если это интересно кому-то еще, я сделал несколько дополнительных открытий:

Эта проблема не имеет ничего общего с попытками обеспечить совместимость с устаревшим приложением и приложением OSX. Пакетный файл содержит код создателя и код OSType. Пока эти два элемента существуют в списке устаревших приложений, он будет открываться по запросу, глобально или индивидуально.

Проблема, похоже, заключается в попытке включить код ostype в список новых приложений в качестве эквивалентного типа в UTI экспортированного типа.

Единственное решение, которое, похоже, работает, - это добавить массив расширений имен файлов как эквивалентный тип, как @Derek, упомянутый для начала.

Это единственное решение, которое решает эту проблему. По иронии судьбы это нарушает руководящие принципы пользовательского интерфейса Apple, в которых до некоторой степени говорится, что пользователя не следует принуждать к ограничениям расширения файлов.

Похоже, что UTI работает только с несвязанными документами (файлами), что также подтверждается несколькими публикациями, в которых в основном говорится, что Apple действительно облажалась. Какой смысл беспокоиться об ИМП, если в конце концов вам все равно понадобится массив расширений?

person Miek    schedule 17.10.2013