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

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

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

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

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

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

Спасибо!

7 ответов

Решение

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

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

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

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

Затем сохраните это как приложение. Затем в Finder используйте "Показать содержимое пакета" для редактирования 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>

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

На сегодняшний день лучший способ, который я нашел для решения этой проблемы на 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

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

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

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

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

Я не очень разбираюсь в Mac, поэтому буду признателен за любую помощь.

Пытаюсь добавить свой собственный протокол с помощью duti run в постустановочном скрипте установщика пакетов :

      #!/bin/sh
## 
##  add_handlers.sh -- register UTI handlers for the MyApp
##
##  Requires the duti tool
##

./duti -s MyApp myapp

Обработчик отображается на панели настроек RCDefaultApp, но при вызове из другого моего приложения он открывает Safari с этим протоколом в адресной строке и спрашивает: «Вы хотите разрешить этой странице открывать «MyApp»? И при нажатии кнопки «Разрешить» отображается ошибка:

Safari не может открыть указанный адрес. Safari не может открыть «myapp://», потому что macOS не распознает интернет-адреса, начинающиеся с «myapp:».

Также при попытке открыть из терминала:

[электронная почта защищена] ~ % открыть myapp://

LSOpenURLsWithRole() завершился с ошибкой -10810 для URL-адреса myapp://.

Другие вопросы по тегам