Как можно получить доступ к функции приложения A из приложения B - PullRequest
2 голосов
/ 06 октября 2010

Мне было интересно, если и каким образом приложение может получить доступ к определенным функциям другого приложения.например

  • открыть URL-адрес в safari / firefox / chrome
  • запустить JavaScript в текущей вкладке браузера
  • воспроизвести / приостановить itunes
  • переименовать выбранные файлы в Finder

Я знаю о существовании applecript, но мне было интересно, если это единственный способ мне взаимодействовать с этими приложениями и другими

спасибо

Ответы [ 2 ]

7 голосов
/ 06 октября 2010

Существует три основных способа, которыми приложение отображает свою функцию для внешнего мира.

  1. Одним из них является поддержка протокола URL. Чтобы открыть URL, просто используйте NSWorkspace. Есть много методов; если приложение регистрирует определенный протокол, такой как x-my-app://some-work, вы можете просто сделать

    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"x-my-app://some-work"] ];
    

    Если вы хотите открыть URL-адрес, протокол которого (например, http), поддерживается многими приложениями, и если вы хотите указать, какое приложение использовать, используйте openURLs: withAppBundleIdentifier: options: AdditionalEventParamDescriptor: launchIdentifiers: .

  2. Другим является Системные службы . При этом приложение может добавлять записи в меню «Сервис» и в контекстном меню других приложений; Вы также можете вызвать это программно.

  3. В противном случае это происходит через Apple. Applescript - это один из способов справиться с ними, но не единственный. Это просто язык для выпуска событий Apple. Есть много способов справиться с событиями Apple из Какао, см. этот подробный документ от Apple.

    По сути, приложение может экспортировать свои внутренние данные объектно-ориентированным способом (который не только является его иерархией Objective-C; вы можете контролировать, сколько своих внутренних объектов и методов вы предоставляете и т. Д.) С помощью sdef файл. Затем другое приложение может использовать эту объектно-ориентированную систему через события Apple.

    Для отправки и получения событий Apple вы, конечно, можете создавать их вручную, но вы можете использовать объекты более высокого уровня, такие как

    Чтобы узнать, какие аспекты предоставляет приложение, просто откройте редактор AppleScript, выберите меню «Файл» → «Открыть словарь» и выберите приложение.

Теперь довольно сложно использовать функции приложения, которые приложение не предоставляет ни одним из этих методов. У вас еще есть несколько обходных путей.

  1. Сценарии пользовательского интерфейса . Это делается путем отправки Apple Events в безголовое приложение под названием System Events, которое является одной из основных программ в OS X. Таким образом, вы можете программно эмулировать нажатие кнопки, выбор меню и т. Д. Другого приложения. Таким образом, практически все, что вы можете сделать с помощью графического интерфейса пользователя с другим приложением, может быть сделано программно из другого приложения. Чтобы увидеть иерархию объектов пользовательского интерфейса, доступных из сценариев пользовательского интерфейса, используйте утилиту, которая поставляется с инструментами XCode, по адресу

    /Developer/Applications/Utilites/Accessibility Tools/Accessibility Inspector.app
    

    Это очень элементарно, но делает работу; если вы регулярно используете сценарии пользовательского интерфейса, рассмотрите возможность получения браузера пользовательского интерфейса , как рекомендует Zygmunt.

  2. Наконец, если вы хотите использовать функцию без доступа к графическому интерфейсу другого приложения, вы можете добавить код в другое приложение.

1 голос
/ 07 октября 2010

Просто расширяю ответ Юджи. Если вы были вынуждены пойти по пути сценариев пользовательского интерфейса, есть хорошее приложение для анализа интерфейса - hxxp: //pfiddlesoft.com/uibrowser/. Однако приведенные вами примеры должны раскрывать некоторые API.

Я также мог бы порекомендовать использовать Sikuli hxxp: //groups.csail.mit.edu/uid/sikuli/ в качестве IDE для надежного создания сценариев вокруг пользовательского интерфейса.

Для некоторых приложений, обычно поступающих из GNU / Linux, есть D-BUS hxxp: //en.wikipedia.org/wiki/D-Bus - хотя я еще не использовал его на Mac самостоятельно. И позвольте мне также процитировать Википедию о Какао: «Это один из пяти основных API-интерфейсов, доступных для Mac OS X; остальные - Carbon, POSIX (для среды BSD), X11 и Java». hxxp: //en.wikipedia.org/wiki/Cocoa_%28API%29 Это простой совет для дальнейшего изучения, так как Юджи уже объяснил события Apple, которые являются ключевыми для вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...