Как я настраиваю пользовательские обработчики URL на OS X?

64

Я много читал в Интернете о пользовательских обработчиках URL / пользовательских протоколах, таких как:

Я понял, что вы можете сказать системе, что определенная программа может обрабатывать определенную схему / протокол с Info.plistфайлом:

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

Но если есть несколько приложений, которые могут открывать один и тот же обработчик URL, например, mailto:как указать, какое из них вы хотите использовать в системе?

Были некоторые ссылки на такие утилиты, More Internet preference paneкоторые больше не доступны на сайте автора. Я нашел его в Интернете от Google, но он кажется немного шатким - как это было написано для более старой OSX - возможно, Tiger.

Я не смог найти информацию о том, как установить обработчик URL для протоколов и пользовательских протоколов. Я предполагаю, что plistгде-то есть файл, который я могу отредактировать - или, может быть, есть более новая, лучшая утилита, которая хорошо работает с Mountain Lion?

УХО
источник

Ответы:

55

Файл вы ищете это ~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist.

Он содержит массив с именем LSHandlers, и дочерние элементы Dictionary, которые определяют a, LSHandlerURLSchemeмогут быть изменены соответственно с помощью LSHandlerRole.

Вместо того, чтобы вручную редактировать этот файл, вы также можете использовать RCDefaultApp , который дает вам хорошую панель настроек. Говорят, что он не работает для macOS 10.12 и выше, но я могу подтвердить, что он работает под macOS 10.14.

Альтернативой является SwiftDefaultApps .

Например, вот SVN и SSH:

... и в RCDefaultApp:

slhck
источник
35
4 минуты 19 секунд? Шутки в сторону?
Даниэль Бек
2
Спасибо за быстрый и подробный ответ. Выглядит неплохо! Вопрос, хотя - я думаю, что я пробовал RCDefaultApp раньше и имел некоторые проблемы с ним. Это работало без проблем для вас?
cwd
@cwd Честно говоря, я должен сказать, что не пользуюсь им часто. Больше для скриншотов для Super User, чем для чего-либо еще :) Всякий раз, когда мне нужно изменить ассоциации файлов, я делаю это через диалог Get Info ... в Finder. Мне никогда не нужно было менять протокол и обработчики MIME. Но это казалось достаточно стабильным для меня.
Slhck
Это, кажется, чтобы открыть настоящее «приложение». Что если я захочу выполнить какую-то пользовательскую обработку, используя команду терминала и т. Д.?
Nute
1
@nute Просто с макушки головы, не уверен. Возможно приложение, созданное с помощью Automator, которое обертывает сценарий оболочки?
Slhck
14

Обновление июль 2017: RCDefaultApp и lstoolбольше не работает на MacOS 10.12 или более поздней версии . Мы должны найти новое решение.

Edit Mar 2018
Я нашел SwiftDefaultApps, но не могу проверить, так как я еще не на High Sierra.


В продолжение предыдущего ответа, если вы хотите сделать это в командной строке, вы можете использовать lstoolкоманду, которая является ядром RCDefaultApp, которая находится в RCDefaultApp.prefPane/Contents/Resources/lstool.

Его использование просто:

[~]$lstool --help
Usage:

lstool read [<lsscheme> [<type>]]
lstool [-n] write <lsscheme> <type> <app>
lstool [-n] setoption <lsscheme> <type> login|ignorecreator YES|NO
lstool [-n] register {<app>}
lstool [-n] unregister {<path> | <app>}
lstool apps

-n means do not make changes
<lsscheme> is one of: internet, media, url, extension, uti, mime, ostype
<app> is the path to an application or a name to be looked up
Куинн Комендант
источник
2
Я нашел возможную замену RCDefaultApp на github.com/Lord-Kamina/SwiftDefaultApps, хотя вам придется создать его самостоятельно с помощью Xcode.
luckman212
Я использую версию 2.1 RCDefaultApp, и она прекрасно работает для меня 10.12. По крайней мере, все еще перечисляет все предметы. Или только какая-то конкретная операция больше не работает? Пожалуйста, уточните
SuperTempel
@SuperTempel Средство lstoolкомандной строки отображает эту ошибку, когда вы пытаетесь ее запустить: objc[1049]: Objective-C garbage collection is no longer supported.( lstoolэто внутренняя программа, используемая панелью настроек RCDefaultApp. Хотя панель настроек, кажется, работает, я не думаю, что она может что-либо сделать, потому что не lstoolработает. )
Куинн Комендант
SwiftDefaultApps, очевидно, не работает на процессорах Intel. Нет исправлений, по крайней мере, до апреля 2018 года.
Куинн Комендант
3
Я являюсь разработчиком SwiftDefaultApps, SWDA была написана с самого начала с macOS Sierra и выше (на самом деле, я начал работать над этим после большого разочарования, читая этот вопрос и подобные). Он не работал в 10.13 в основном из-за ошибки в Swift или в самой macOS, но, похоже, это было исправлено в обновлении до 10.13.4 / Swift 4.1.
Грегорио Литенштейн
11

Перечисление текущих настроек обработчика URL-адресов LaunchServices в Apple OS X 10.10 (Yosemite):

defaults read com.apple.LaunchServices/com.apple.launchservices.secure
VirtualJMills
источник
Yay для использования встроенных инструментов, которые не ломаются или требуют, чтобы Вы загрузили кое-что.
xdhmoore
Это не перечисляет все значения по умолчанию для каждого протокола, только некоторые.
Вадим Перетокин
5

Я на самом деле написал приложение, упрощающее регистрацию пользовательских протоколов URL, если кому-то интересно. Он называется LinCastor ( http://onflapp.wordpress.com/lincastor/ ). Обработчики могут быть определены как AppleScript или сценарий оболочки (который может быть perl, python или что-либо еще).

На флапе
источник
Очень хорошая идея, но я боюсь, что не могу заставить работать прилагаемый примерный скрипт. Подробнее о вашем блоге в ожидании модерации: getitdoneapps.wordpress.com/lincastor-browser/support/…
Флэш Шеридан
Это казалось странной странностью, связанной с разрывом строки в файле примера, диагностируемой при запуске сценария из командной строки. («/ Bin / sh: плохой интерпретатор: операция не разрешена») Сохранение копии в BBEdit, а также изменение и перезапись разрывов строк в / из Windows решают проблему.
Флэш Шеридан
5

Открыть файл с помощью XCode работает довольно легко.

Использование команды build in, plutilкак описано в ответе на https://discussions.apple.com/thread/5815759, для преобразования между форматами xml1 или binary1 работает аналогично.

plutil -convert xml1 /file-i-wish

nano /file-i-wish & save file 

plutil -convert binary1 /file-i-wish

Нет необходимости в «чужих» инструментах :-)

Клеменс Толбом
источник
4

Вы также можете использовать duti :

echo $'com.apple.mail mailto\ncom.googlecode.iterm2 x-man-page'>~/.duti;duti ~/.duti
LRI
источник
0

Я только что попробовал старый интернет More под El Capitan.

Это забавно, и единственный способ, которым он работает, - это использование клавиш со стрелками вверх и вниз для выбора протокола и перетаскивание значка APP в окно, чтобы внести изменения.

Я переключился по умолчанию с Safari на Chrome, и изменения застряли, так что он работает до сих пор.

Калгари Гуру
источник
Что это? Ваш ответ неясен.
lacostenycoder
0

Другой способ перечислить текущие настройки обработчика URL-адресов LaunchServices с помощью Xcode в Apple OS X 10.10+ (Yosemite):

open -a Xcode ~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist
oikonomopo
источник