событие Apple
События Apple на основе сообщений — это механизм межпроцессного взаимодействия в Mac OS , впервые появившийся в System 7 и с тех пор поддерживаемый всеми версиями классической Mac OS , а также macOS . События Apple описывают события «высокого уровня», такие как «открыть документ» или «распечатать файл», тогда как более ранние ОС поддерживали гораздо более базовые события, а именно «щелчок» и «нажатие клавиши». События Apple составляют основу системы сценариев Mac OS, открытой архитектуры сценариев (основным языком которой является AppleScript ).
Отправной точкой является динамически типизированный расширяемый формат дескриптора, называемый AEDesc , который представляет собой просто код OSType , определяющий тип данных вместе с блоком зависящих от типа данных. Например, код OSType inte
указывает, что данные представляли собой четырехбайтовое целое число со знаком в формате с обратным порядком байтов .
Помимо предопределенных кодов типов для различных распространенных простых типов, существует два предопределенных типа структурированных дескрипторов: AERecord , который имеет тип данных reco
(запись) и AEList с типом list
(список или массив). Их внутренняя структура содержит рекурсивно вложенные AEDescs, в то время как AERecord также связывает каждый элемент с уникальным идентификатором поля записи, который является OSType. Apple Event Manager предоставляет вызовы API для создания этих структур, а также для извлечения их содержимого и запроса типа содержимого, которое они содержат.
Apple Event Manager также поддерживает приведение , которое преобразует AEDescs из одного типа данных в другой. В дополнение к стандартным приведениям, например, между целочисленными и вещественными типами, приложения могут устанавливать свои собственные обратные вызовы обработчиков приведения , которые обрабатывают преобразования в пользовательские типы данных и из них.
Собственно событие Apple представляет собой AERecord с полями, которые зависят от цели события. Кроме того, он имеет атрибуты (которые отличаются от полей записи, которые теперь называются параметрами события ) из набора, предопределенного Apple Event Manager. Они определяют, что должно делать событие (через класс события и идентификатор события ), целевой адрес, на который должно быть отправлено событие (это может быть процесс на локальном или удаленном компьютере), а также различные другие параметры обработки. это. Удаленные машины изначально нужно было подключать через AppleTalk , но в Mac OS 9 появилась возможность подключения через TCP/IP .
После отправки события Apple целевому процессу процесс отправки может выбрать получение ответа на событие Apple. Он может содержать различные биты информации, возвращаемой от цели, об обработке исходного события, включая код ошибки, указывающий успех/неуспех, любую информацию, запрошенную исходным событием, и/или другую соответствующую информацию.
События Apple являются основой объектной модели AppleEvent , которая, в свою очередь, является основой OSA и AppleScript . По состоянию на 2016 год [update]официальная реализация Apple Event Manager API доступна на языке C и его потомках, включая C++ . Официальные привязки также предоставляются для Objective-C и Swift через Cocoa API . Неофициальные привязки также существуют для других языков (с различной степенью ограничений), включая Perl , UserTalk , Ruby и Python .
Объектная модель
[ редактировать ]( Объектная модель AppleEvent AEOM ) представляла собой набор протоколов, построенных на основе AppleEvents , с помощью которых приложения, работающие под классической Mac OS и macOS, могли управлять функциями друг друга. Приложения, реализовавшие некоторую часть AEOM, назывались скриптуемыми , поскольку ими можно было управлять через AppleScript . К сожалению, поддержка сценариев оставалась неоднородной и непоследовательной на протяжении всей истории классической Mac OS.
AEOM предоставил синтаксический уровень, на котором любое приложение могло публиковать свои внутренние объекты, позволяя манипулировать этими объектами стандартизированным способом. В отличие от других схожих по звучанию концепций, таких как ToolTalk существовало четкое, ортогональное различие , между существительными и глаголами ; таким образом, вместо предоставления отдельных команд для «закрыть документ» и «закрыть окно», был один глагол «закрыть», который мог принимать ссылки на объекты «документ» или «окно» или любой другой объект, опубликованный приложением.
Объекты, которые приложение сделало доступными благодаря поддержке AEOM, были организованы в иерархию. Вверху было само приложение, на которое ссылались через нулевой дескриптор объекта. На другие объекты ссылались (рекурсивно) с указанием их родительского объекта вместе с другой информацией, идентифицирующей его как дочерний элемент этого родительского объекта, и все это собиралось в AERecord . Итератор . был предоставлен родителями для перечисления своих дочерних элементов или дочерних элементов определенного класса, что позволяло приложениям обращаться к набору элементов Система в целом была похожа на объектную модель документа, используемую в XML , хотя и с некоторыми различиями в шаблонах доступа.
Каждый объект может иметь элементы и свойства ; элементами были другие объекты, которые можно было создавать или удалять, тогда как свойства нельзя было создавать или удалять, но они имели значения, которые можно было запрашивать или изменять. Например, приложение может иметь один или несколько оконных элементов, представляющих окна, отображающие содержимое открытых в данный момент документов. Эти окна могут иметь такие свойства , как заголовок, положение и размер.
Приложение может определять собственные команды для работы со своими объектами. AEOM также определил различные стандартные команды, которые (как надеялись) приложения будут реализовывать согласованным образом, например, открыть, закрыть, создать элемент, удалить, установить данные и получить данные. Каждый глагол определялся как AppleEvent определенного типа и класса вместе с определенными параметрами определенных типов, которые должны были присутствовать. Например, событие «получить данные» было стандартным средством получения значения свойства: по сути, оно принимало один параметр, который представлял собой дескриптор объекта, идентифицирующий запрашиваемое свойство. Значение этого свойства будет возвращено в событии ответа. Событие «установить данные» принимало два параметра: дескриптор объекта для устанавливаемого свойства и новое значение свойства; Ожидалось, что событие ответа вернет только статус успеха или код ошибки сбоя.
Вся архитектура AppleEvent идентифицирует объекты, используя четырехбайтовые коды OSType , старательно избегая реальных слов или фраз на английском (или любом другом языке). Вместо этого соответствие между внутренними кодами AppleEvent и внешними описаниями на естественном языке определяется через aete ( AppleEvent Terminology Extension ) ресурс — «расширение» относится к стандартной терминологии, встроенной в сам AppleScript. Приложение может предоставлять несколько ресурсов aete для нескольких языков в соответствии с исходным многоязычным дизайном самого AppleScript.
Например, рассмотрим следующую последовательность AppleScript, управляющую вымышленным приложением для рисования:
tell application "ScriptableDraw"
set background color of window "New Drawing" to background color of window "Old Drawing"
end tell
Фактически это включает в себя отправку двух событий AppleEvent в целевое приложение (и получение соответствующих ответов): сначала отправляется событие получения данных для получения свойства цвета фона окна, идентифицируемого именем «Старый рисунок»; затем отправляется событие set-data, чтобы применить значение, возвращенное в качестве свойства цвета фона окна с именем «Новый рисунок».
Поскольку такой шаблон доступа был типичным, AppleScript широко использовал tell
оператор, который переключал контекст на именованный объект аналогично with
оператор, найденный в Visual Basic или Pascal . Все команды после tell
соответствующему end tell
будет отправлен на объект, указанный в tell
, вместо объекта по умолчанию, которым было текущее приложение.
Дескрипторы объектов позволяли идентифицировать объекты различными способами. Самым интересным было использование предложенияwhere (которое переводится в терминологию AppleScript как выражение фильтра ). Например, AppleScript 1.0 SDK поставляется с исходным кодом примера приложения под названием Scriptable Text Editor, которое будет реагировать на такие сценарии, как:
tell application "Scriptable Text Editor"
tell window "Example Document"
set text style of every word whose length > 7 to bold
end tell
end tell
Даже сегодня редко можно найти такую мощь в языках сценариев общего назначения за пределами SQL .
Добавление поддержки AEOM в классическую Mac OS было трудным процессом. Разработчикам приложений приходилось идентифицировать свои объекты и писать код вручную, чтобы можно было обращаться к ним. Обычно это принимало форму кода для возврата «следующего» объекта определенного типа, позволяя AppleScript перебирать их. Но поскольку ОС не содержала объектной модели, эта работа была полностью оставлена разработчикам, многие из которых ее не реализовали. Apple Как ни странно, даже собственная платформа приложений , MacApp , не предлагала такой модели, за исключением известных ей объектов графического интерфейса , что в очередной раз заставляло разработчика выполнять большую часть работы по написанию сценариев для объектов, представляющих сами данные. Во многом по этим причинам поддержка AppleScript не получила широкого распространения.
Apple попыталась решить эту проблему, представив различные «наборы» объектов, которые представляли собой стандартные объекты и глаголы, которые, как ожидалось, будут поддерживаться различными типами приложений. Например, ожидалось, что все приложения будут поддерживать «основной набор», а любое приложение для редактирования текста должно было поддерживать «текстовый набор». Выбрав подходящий набор пакетов, разработчик мог бы, по крайней мере, уменьшить нагрузку по планированию раскрытия своих объектов. Однако поскольку эти объекты обычно не были частью самой системы (за исключением сильно ограниченного редактора TextEdit), фактическая реализация была оставлена на усмотрение разработчика.
Приложения, разработанные в Cocoa , системе, ранее известной как OpenStep , предлагают богатую среду выполнения объектов, которую можно запрашивать из любого другого приложения. Это значительно упрощает реализацию AEOM, значительно сокращая объем кода, необходимого для обычного приложения. Кроме того, большинство приложений Cocoa созданы в основном из объектов стандарта Cocoa, все из которых были обновлены, чтобы обеспечить довольно широкие возможности сценариев. Это распространяется не только на объекты графического интерфейса, как в MacApp, но и на объекты данных внутри них, включая текст, таблицы и различные объекты списков. Текстовый файл используется для сопоставления внутренних «объектных» имен с удобочитаемыми версиями, и в большинстве случаев его создание — это все, что необходимо для добавления достаточно существенных возможностей сценариев в большинство программ.
Хотя приложения Cocoa не основаны на AEOM и часто используют объекты, слегка отличающиеся от первоначально определенных стандартных объектов Apple, приложения Cocoa, как правило, гораздо более доступны для сценариев, чем их «классические» аналоги — на самом деле, редко можно найти приложение Cocoa, которое не поддерживает сценарии. в некоторой степени.
Скриптовый мост
[ редактировать ]Scripting Bridge — это платформа macOS, которая позволяет приложениям взаимодействовать друг с другом без использования промежуточного языка сценариев, такого как AppleScript . Как и AppleScript, Scripting Bridge использует события Apple для взаимодействия между приложениями . [1]
Scripting Bridge обычно используется из Objective-C , [1] но может использоваться в других языках программирования через мост Objective-C, например MacRuby. [2] и PyObjC .
Дальнейшее чтение
[ редактировать ]- Кук, Уильям Р. (29 сентября 2006 г.), «AppleScript» (PDF) , Материалы третьей конференции ACM SIGPLAN по истории языков программирования , Техасский университет в Остине, стр. 1–1–1–21, CiteSeerX 10.1 .1.76.6993 , doi : 10.1145/1238844.1238845 , ISBN 9781595937667 , S2CID 220938191 , получено 9 мая 2009 г.
{{citation}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ) . В частности, см. раздел 2.3 «События Apple» (стр. 9–13), хотя история и важность событий Apple также обсуждаются в других частях статьи.
Ссылки
[ редактировать ]- ^ Jump up to: а б «Скриптовый мост» . Документация разработчика Apple . Проверено 4 февраля 2023 г.
- ^ Пол, Райан (27 сентября 2011 г.). «Учебное пособие: автоматизация OS X с помощью MacRuby и Scripting Bridge» . Арс Техника . Проверено 4 февраля 2023 г.