Ассоциация файлов приложения macOS

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

Я работаю над приложением, которое распространяется для macOS. Я хотел бы связать пользовательское расширение файла с моим приложением. Я хотел бы, чтобы пользователь мог дважды щелкнуть один из файлов и открыть его приложением. Мне достаточно легко выбрать приложение для открытия файлов, но я не могу понять, как получить имя файла для открытого файла.

Единственное, что я нашел до сих пор, это создать приложение из AppleScript. Затем AppleScript может проанализировать аргументы и вызвать с ними основное приложение. У меня есть две проблемы с этим подходом.

Во-первых, что произойдет, если пользователь изменит его и выберет приложение напрямую? я так понял он просто не работает? Есть ли способ обойти это?

Во-вторых, как мне связать приложение автоматически? Я нашел информацию о CFBundleTypeExtensions, но позже обнаружил, что это устарело. Я нашел некоторую информацию о UTI и Launch Services. Имеет смысл добавить UTI в файл plist и запустить команду lsregister. Как бы вы сделали это автоматически? Пользователь устанавливает приложение с помощью dmg, в какой момент я могу запустить команду lsregister?


person thecaptain0220    schedule 04.03.2019    source источник


Ответы (1)


Добавьте что-то вроде следующего в ваш Info.plist. Он сообщит macOS, что ваше приложение обрабатывает файлы .foo и .bar.

<key>CFBundleDocumentTypes</key>
<array>
<dict>
    <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    <key>CFBundleTypeExtensions</key>
    <array>
        <string>foo</string>
        <string>bar</string>
    </array>
    <key>CFBundleTypeIconFile</key>
        <string>FileIcons.icns</string>
    <key>CFBundleTypeMIMETypes</key>
        <string>application/octet-stream</string>
    <key>CFBundleTypeName</key>
        <string>Something Unique Here</string>
    <key>CFBundleTypeOSTypes</key>
    <array>
        <string>****</string>
    </array>
</dict>
</array>

FileIcons.icns должен содержать файлы значков для зарегистрированных файлов. Если вы не хотите создавать значки файлов, вы можете оставить эту строку пустой:

<key>CFBundleTypeIconFile</key>
    <string></string>

CFBundleTypeMIMETypes установлен на application/octet-stream выше. Это тип MIME для общих двоичных данных. Если файлы действительно имеют правильные типы MIME, используйте их.

Как только macOS увидит ваше приложение (например, при его загрузке), она автоматически узнает, что нужно открыть .foo и .bar. Вам не нужно запускать ничего внешнего.

Наконец, ваше приложение будет запущено macOS, когда пользователь дважды щелкнет файл .foo или .bar, и оно получит событие «открыть файл». Вы должны справиться с этим. Как вы это сделаете, зависит от того, какой фреймворк/язык вы используете для разработки своего приложения.

person Nikos C.    schedule 04.03.2019
comment
Это именно то, что я искал. Самое главное - это событие открытия файла, я не знаю, почему я не видел информации об этом, когда искал. Как только вы упомянули об этом, было просто найти то, что мне нужно, и реализовать это. Я разрабатываю в qt, поэтому я смог использовать это, чтобы сделать это. doc.qt.io/qt-5/qfileopenevent.html - person thecaptain0220; 05.03.2019