Как сопоставить пользовательский протокол с приложением на Mac? - PullRequest
26 голосов
/ 23 января 2009

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

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

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

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

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

Спасибо!

Ответы [ 6 ]

16 голосов
/ 14 сентября 2010

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

По сути, вы создаете обработчик событий в скрипте:

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's handler</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>abcdef</string>
        </array>
    </dict>
</array>
14 голосов
/ 23 января 2009

У меня не было повода использовать его, но некоторое время назад я добавил в закладки Обработчик 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>
6 голосов
/ 02 сентября 2014

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

Заварочный аппарат 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 голосов
/ 23 января 2009

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

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

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

4 голосов
/ 23 января 2009

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

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

Этот вопрос десятилетний (!), Но поиск в 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"
...