В настоящее время я пытаюсь изменить поведение обработки URL-адресов по умолчанию в OS X. Я хотел бы при нажатии на любую ссылку вне веб-браузера скопировать этот URL-адрес на монтажный стол, а не открывать его в веб-браузере по умолчанию, например , щелчок по ссылке в беседе Skype должен скопировать этот URL-адрес на монтажный стол OS X, а не открывать его в Firefox (который в настоящее время является моим веб-браузером по умолчанию).
Я думал о решениях, но в настоящее время не могу их реализовать. Если я смогу создать приложение, которое помещает URL-адреса в монтажный стол, которые отправляются ему, и смогу установить это приложение в качестве веб-браузера по умолчанию, я смогу достичь своей цели.
Я создал приложение с помощью Automator, которое выполняет команду оболочки pbcopy
, и установил это приложение в качестве веб-браузера по умолчанию, но не получил ожидаемого результата. Я провел некоторое тестирование и могу подтвердить, что приложение запускается при нажатии на ссылку, однако я не могу передать URL-адрес в сценарий приложения/оболочки. Я пробовал как стандартный ввод, так и переданный аргумент, но безуспешно.
Есть ли способ для приложения, созданного с помощью Automator, получить щелкнутый URL-адрес и отправить его pbcopy
, когда это приложение установлено в качестве обработчика (по умолчанию) для URL-адресов?
В качестве альтернативы, есть ли лучший способ создать поддельный веб-браузер, который принимает ввод и помещает его в монтажный стол, чем Automator? Или есть другой способ, которым я могу достичь своей цели без специального приложения/скрипта?
Способ открытия URL в Mac OS X на самом деле сложнее, чем вы думаете. Когда вы щелкаете URL-адрес, Mac OS X не просто передает браузеру URL-адрес для открытия; вместо этого он отправляет ему событие Apple с идентификатором kAEGetURL
, содержащим URL-адрес.
Я никогда не использовал Automator (он слишком медленный и ограниченный для моего обычного использования), поэтому я не уверен в этом, но я сомневаюсь, что он способен обрабатывать события Apple. Поэтому вы не сможете использовать Automator для достижения желаемого.
Поэтому вам придется прибегнуть к обычному приложению Objective-C в Xcode.
Вам нужно сделать две основные вещи:
зарегистрируйте свое приложение для получения события kAEGetURL и установите CFBundleURLTypes
в Info.plist вашего приложения включение http
и https
.
Реализуйте метод, обрабатывающий событие kAEGetURL, и заставьте его копировать URL-адрес в буфер обмена.
Эти две вещи относительно просто сделать в Objective-C; чтобы проиллюстрировать это, я создал пример приложения, которое делает это. Вы можете просмотреть его по адресу https://github.com/houbysoft/short/tree/master/Copy%20URL%20to%20Clipboard . Самый важный файл https://github.com/houbysoft/short/blob/master/Copy%20URL%20to%20Clipboard/Copy%20URL%20to%20Clipboard/AppDelegate.m , там можно посмотреть как зарегистрироваться на событие (это делается в методе applicationWillFinishLaunching:) и как его скопировать в буфер обмена (это делается в методе getUrl:withReplyEvent:).
Если вам лень и вы просто хотите убедиться, что это работает, возьмите этот файл , извлеките из него приложение, установите его в качестве веб-браузера по умолчанию (откройте настройки Safari и найдите это приложение в поле «Веб-браузер по умолчанию»). Затем нажмите на свою ссылку в Skype, и она должна быть скопирована прямо в буфер обмена.
Шаг 1: Установите открытый исходный код и активно поддерживаемый https://github.com/johnste/finicky . Finicky — это приложение, которое позволяет направлять ссылки в разные браузеры на основе заданных вами правил. Чтобы это работало, Finicky должен быть вашим браузером по умолчанию.
Шаг 2: Откройте редактор сценариев, вставьте следующий код и сохраните его как приложение. Давайте назовем это UrlHandler.app:
on open location input
set the clipboard to input
end open location
Шаг 3: Укажите, в какой браузер Finicky должен отправлять ссылки по умолчанию. В ~/.finicky.js измените defaultBrowser на UrlHandler.app на шаге 2.
module.exports = {
defaultBrowser: "com.apple.ScriptEditor.id.UrlHandler",
...
Вот альтернативная конфигурация, которая отправляет ссылки в UrlHandler.app только при нажатии на ссылку с нажатой клавишей Command:
module.exports = {
defaultBrowser: "Firefox",
handlers: [
{
match: ({ keys }) => keys.command,
browser: "com.apple.ScriptEditor.id.UrlHandler"
}
]
};
пингвинробот
Вторник