Как сопоставить настраиваемый протокол с приложением на Mac?

Я пытаюсь зарегистрировать собственный протокол для приложения на Mac, т.е.

  • Пользователь нажимает ссылку "abcdef://some/url/here"
  • Установленное приложение запускается с указанной выше строкой, переданной в качестве первого параметра

Я сделал это успешно в Windows, используя информацию из этого вопроса:

как мне создать собственный протокол URL? (например, так://...)

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

Спасибо!

Ответ 1

У меня не было случая использовать его, но некоторое время назад я добавил обработчик URL-адреса OS X для открытия ссылок на локальные файлы, который именно вы ищете.

Важной частью связанной процедуры является добавление соответствующего CFBundleURLTypes в ваше приложение Info.plist, описывающее схему. Приведенный здесь пример выглядит следующим образом:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Local File</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>local</string>
        </array>
    </dict>
</array>

Ответ 2

На Mac это легко сделать с AppleScript. Самое подробное описание в этой статье Запустить скрипты из ссылок на веб-страницы на Mac. Я читал эту страницу, так как она включает полный проход и полный рабочий пример для загрузки.

В принципе, вы создаете обработчик событий в script:

on open location this_URL
    display dialog "I'm doing something with this URL: " & return & this_URL
end open location

Затем сохраните это как приложение. Затем в Finder используйте Show Package Contents для редактирования Info.plist. Вы добавляете некоторые свойства в приложение, чтобы зарегистрировать его как обработчик вашего протокола.

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Cliff handler</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>abcdef</string>
        </array>
    </dict>
</array>

Ответ 3

Важной частью связанной страницы в ответ Jay является запись в Info.plist.

Я думаю, что с помощью Launch Services он автоматически откроет это приложение, если он будет единственным, кто может обрабатывать определенную схему URL, иначе вам понадобится использовать трюк, который описывает Чарли Мартин.

Я не уверен, что команда по умолчанию, которая должна быть выполнена, или если это команда launchctl.

Ответ 4

На сегодняшний день лучший способ, который я нашел для решения этой проблемы на Mac с наименьшими издержками, - это использование командной строки duti, которая позволяет мне определять в очень простом текстовом файле все мои ассоциации:

заваривать дути

Вам понадобятся две вещи. Первые идентификаторы приложений, которые вы хотите связать:

mdls -name kMDItemCFBundleIdentifier/Applications/MacVim.app

Во-вторых, UTI с типом файла Apple предоставляет список, но вы также можете изучить поддерживаемый UTI с помощью своего приложения, например:

mdls -name kMDItemContentTypeTree/Applications/MacVim.app

Теперь создайте текстовый файл где-нибудь в вашей системе, где вы связываете идентификаторы комплекта с UTI:

# ~/.default-apps.duti
#
# bundle id       UTI                  role
com.apple.Safari  public.html          all
org.vim.MacVim    txmt
org.vim.MacVim    public.ruby-script

Обратите внимание, что я могу связать обработчик URL, такой как txmt, а также типы файлов, такие как сценарии Ruby.

В этом файле вы отслеживаете все настройки своего приложения и воспроизводите их сразу после полной новой установки или при получении учетной записи на другом Mac:

duti ~/.default-apps.duti

Ответ 5

Выкапывать детали сложно, но есть панель предпочтений, называемая RCDefaultApp, которая будет обрабатывать ее для вас. Я все еще хотел бы знать, как это работает, продолжит копать.

Ответ 6

Этому вопросу уже 10 лет (!), Но поиск в Google привел меня сюда, поэтому я хотел упомянуть кое-что, что я только что обнаружил.

Platypus - это инструмент с открытым исходным кодом, который позволяет создавать автономные "Приложения" из сценария оболочки или другого языка сценариев. Хотя это на самом деле просто оболочка для скрипта, он позволяет использовать некоторые интересные вещи, такие как диалоговые окна и элементы строки меню.

Критически, это даже позволяет вам зарегистрировать ваше "приложение" в качестве обработчика для вашей собственной пользовательской схемы URL. Из документов:

Регистрация в качестве обработчика схемы URI заставляет приложение регистрироваться в качестве обработчика для схем URI. Это могут быть стандартные схемы URI, такие как http, или пользовательские схемы URI по вашему выбору (например, myscheme://). Если ваше приложение является обработчиком по умолчанию для схемы URI, оно будет запускаться открытым каждый раз, когда открывается URL, соответствующий этой схеме. Затем URL передается сценарию в качестве аргумента.

Установка очень проста. Просто предоставьте свой скрипт, введите желаемое имя схемы на странице расширенных настроек, а затем нажмите, чтобы создать приложение (все автоматизировано). Все после схемы и слешей будет передано в качестве аргумента в ваш скрипт.

Например, вы можете использовать следующий bash-скрипт в качестве обработчика для протокола "speak://".

#!/usr/bin/env bash
# The 'say' command on macOS will speak the provided text through the speaker
say $1

Вы можете вызвать его, введя speak://say-something-funny в вашем браузере или с помощью команды open в командной строке:

$ open "speak://hello-from-the-command-line"