О сценариях моста

Сценарии Моста являются технологией, упрощающей для программы, записанной в Objective C связываться с scriptable приложениями. Следующие разделы объясняют, что Сценарии Моста, и укажите на его значение разработчикам Какао.

Преимущества сценариев моста

Много приложений на OS X scriptable. scriptable приложение является тем, с которым можно связаться из сценария или другого приложения, позволив Вам управлять приложением и обмениваться данными с ним. Для сценария приложение должно определить интерфейс для ответа на команды. Этот интерфейс и его реализация должны соответствовать объектной модели (предписанный Архитектурой открытых систем или OSA), который указывает классы сценариев объектов, доступных свойств тех объектов, наследования и отношений включения сценариев объектов и команд, на которые отвечает scriptable приложение. Команды пакетов OSA к scriptable приложениям как события Apple и использование менеджер по корпоративным мероприятиям Apple, чтобы диспетчеризировать те события и получить данные в ответ. События Apple являются распространяющейся функцией OS X; например, операционная система использует их, чтобы управлять жизненными циклами приложений и скоординировать их взаимодействия.

Сценарии AppleScript долго были основным способом связаться с scriptable приложениями. Но приложение может также отправить команды в scriptable приложение и получить ответы назад на него. «Традиционный» способ сделать это требует, чтобы Вы использовали структуры данных и функции платформы OSA, чтобы создать и отправить события Apple, но это может быть задачей комплекса dauntingly. Типичные приложения Какао — до Сценариев Моста, который является — полагались на один из двух других методов. Они включали сценарий AppleScript в комплект приложений и использовали Какао NSAppleScript класс для выполнения сценария. Или они использовали NSAppleEventDescriptor класс для создания событий Apple, которые они тогда отправляют с подпрограммами менеджера по корпоративным мероприятиям Apple. Однако оба из этих подходов не являются прямыми для разработчиков Какао и могут быть неэффективными.

Платформа Моста Сценариев позволяет отправить и получить события Apple с помощью сообщений Objective C вместо команд AppleScript или дескрипторов события Apple. Для программистов Какао, Пишущий сценарий Моста обеспечивает простую и ясную модель для управления scriptable приложениями. Это делает программы Какао, отправляющие и получающие более эффективные события Apple, и это не требует, чтобы у Вас было детальное знание модели событий Apple целевого приложения. Сценарии Моста интегрируются хорошо с существующим кодом Objective C и работами со стандартными проектами Какао, такими как кодирование значения ключа, целевое действие и объявленные свойства. Это имеет другие преимущества также.

Поскольку Сценарии Моста динамично заполняют пространство имен приложения с объектами Objective C, представляющими элементы, определенные определением сценариев приложения, это позволяет другим языкам сценариев, соединенным мостом к Objective C — а именно, RubyCocoa и PyObjC — связаться с и управлять scriptable приложениями. Это таким образом дает тем языкам сценариев те же преимущества как сценарии AppleScript и Мост Сценариев использования программ Objective C. Для получения дополнительной информации об использовании Сценариев Моста в коде RubyCocoa и PyObjC посмотрите Ruby и Темы Программирования Python для OS X.

Как сценарии работ моста

Когда Вы запрашиваете экземпляр scriptable приложения от Сценариев Моста, это сначала определяет местоположение пакета приложения идентификатором пакета, URL или идентификатором процесса (в зависимости от того, что Вы указываете). Это тогда получает от пакета определение сценариев приложения, содержавшегося в sdef файл (или, для более старых приложений, его терминологии комплекта и файлов определения комплекта) и синтаксические анализы это. От элементов в определении сценариев — классов, свойств, элементов, команд, и т.д. — это динамично объявляет и реализует классы Objective C, соответствующие классам сценариев приложения. Динамично сгенерированные классы наследовались от одного из классов, определенных платформой Моста Сценариев, SBObject.

Классы сценариев приложения часто существуют в иерархических отношениях наследования, но существует также иерархия вместимости или граф объектов. Когда Вы просите у объекта объекты, он содержит, Писание сценарий Моста инстанцирует тех объектов от надлежащих классов сценариев и возвращает их. Если Вы запрашиваете, чтобы объекты, содержавшие одним из тех объектов, Пишущий сценарий Моста, инстанцировали новых объектов сценариев от надлежащего класса и возвратили тех. Обычно это продолжается, пока Вы не достигаете вершины графика, который обычно является свойством, содержащим фактические данные.

В корне графа объектов экземпляр динамично сгенерированного подкласса SBApplication это представляет объект приложения; в случае iTunes, например, которым называют подкласс iTunesApplication. Для других объектов сценариев в графе объектов (например, «документ» или «дорожка»), Пишущий сценарий Моста использует экземпляр динамично сгенерированный SBObject подкласс; дорожка iTunes, например, представлена iTunesTrack экземпляр. Элементы, указывающие к - много отношений с другими объектами сценариев, реализованы как методы тот возврат экземпляры SBElementArray. SBElementArray подкласс NSMutableArray, и таким образом, можно отправить, это передает такой как addObject: и objectAtIndex:.

Сценарии Моста реализуют команды и свойства (прямо или косвенно) как методы SBApplication подкласс или одного из классов сценариев приложения. Это реализует свойства класса, поскольку Objective C объявил свойства, который приводит к синтезу методов доступа для тех свойств. Многие из этих методов доступа возврат, и иногда набор, объекты надлежащего типа Набора Основы или Приложения, такой как NSString, NSURL, NSColor, и NSNumber. Эти свойства представляют конкретные данные scriptable приложения. (См. “О Приложениях Какао Scriptable “в Руководстве по созданию сценариев Какао для отображения типов Какао к типам AppleScript.) Для команд, Пишущий сценарий Моста оценивает прямой параметр для определения класса для присвоения реализации метода. Если это - определенный класс сценариев (такой как document), команда становится методом того класса; если это имеет универсальный класс (такой как specifier), это становится методом SBApplication подкласс.

При сценариях объектов в Сценариях Моста — т.е. объекты произошли из SBObject— чрезвычайно объектные спецификаторы. Т.е. они - ссылки на объекты в scriptable приложении. Чтобы получить или установить конкретные данные в приложении, объект сценариев должен быть оценен, который приводит к Сценариям Моста, отправляющего событие Apple в приложение. Для больше при сценариях объектов как объектные спецификаторы, посмотрите Объектные Спецификаторы и Оценку.

Пример: приложение эскиза

Лучший способ понять, как Сценарии Моста обрабатывают определение сценариев приложения, состоит в том, чтобы смотреть на «реальное» приложение, в этом случае приложение Эскиза. Проект Эскиза в качестве примера в <Xcode>/Examples/AppKit создает простое, но функционально полное графическое приложение; с ним можно нарисовать и окрасить геометрические фигуры, строки и текст. Проект включает sdef XML-файл, определяющий интерфейс сценариев приложения. Перечисление 1-1 показывает часть sdef файл, определяющий Эскиз document класс.

Перечисление 1-1  определение document класс для Эскиза

<class name="document" code="docu" description="A Sketch document.">
           <cocoa class="SKTDrawDocument"/>
           <property name="name" code="pnam" type="text" access="r" description="Its name.">
                <cocoa key="displayName"/>
            </property>
            <property name="modified" code="imod" type="boolean" access="r" description="Has it been modified since the last save?">
                <cocoa key="isDocumentEdited"/>
            </property>
            <property name="file" code="file" type="file" access="r" description="Its location on disk, if it has one.">
                <cocoa key="fileURL"/>
            </property>
 
            <!-- This is just here for compatibility with old scripts. New scripts should use the more user-friendly file property. -->
            <property name="path" code="ppth" type="text" access="r" description="Its location on disk, if it has one, as a POSIX path string." hidden="yes">
                <cocoa key="fileName"/>
            </property>
 
            <element type="graphic"/>
            <element type="box">
                <cocoa key="rectangles"/>
            </element>
            <element type="circle"/>
            <element type="image"/>
            <element type="line"/>
            <element type="text area"/>
            <responds-to name="close">
                <cocoa method="handleCloseScriptCommand:"/>
            </responds-to>
            <responds-to name="print">
                <cocoa method="handlePrintScriptCommand:"/>
            </responds-to>
            <responds-to name="save">
                <cocoa method="handleSaveScriptCommand:"/>
            </responds-to>
        </class>

Средство просмотра Словаря (доступный из приложения Редактора сценариев) выводит на экран это определение XML document класс как показано на рисунке 1-1. Это показывает включение document application, и это включает обоих общая собственность класса (полученный из Стандартного Комплекта), а также специализированные элементы: графика, поля, круги, и т.д.

Рисунок 1-1  document класс в словаре Эскиза
The document class in the Sketch dictionary

Сценарии Моста переводят определение Эскиза document класс в следующие объявления Objective C:

 
@interface SketchDocument : SketchItem
 
@property (readonly) BOOL modified;  // Has the document been modified since the last save?
@property (copy) NSString *name;  // The document's name.
@property (copy) NSString *path;  // The document's path.
 
@end
 
// More class declarations here.....
 
@interface SketchDocument (SketchSuite)
 
- (SBElementArray *) circles;
- (SBElementArray *) graphics;
- (SBElementArray *) images;
- (SBElementArray *) lines;
- (SBElementArray *) rectangles;
- (SBElementArray *) textAreas;
@end

Обратите внимание на то, что Сценарии Моста делают заявления для SketchDocument класс в двух частях. Начальная буква объявила, что свойства для общей собственности document сценарии класса, как определено Стандартным Комплектом. Категория добавляет объявления, определенные для Комплекта Эскиза; они объявляют методы (соответствующий элементам в определении сценариев) тот возврат SBElementArray объекты.

Рисунок 1-2 изображает, как Сценарии Моста преобразовывают Эскиз, пишущий сценарий определения класса документа в неявный график объектов, составляющий иерархию вместимости приложения. В корне графика экземпляр SketchApplication класс, наследовавшийся от SBApplication класс. Этот объект приложения содержит один или несколько экземпляров SketchDocument класс, наследовавшийся от SketchItem класс, сам потомок SBObject класс.. Каждый элемент, содержавший document класс реализован как метод, возвратившись SBElementArray объект, который является подклассом NSMutableArray.

  Граф объектов рисунка 1-2, представляющий Эскиз document класс
Object graph representing the Sketch document class

Таким образом graphics метод возвращает нуль или больше SketchGraphic объекты — каждый соответствует a graphic объект в определении сценариев — использование SBElementArray возразите как контейнер. graphic сценарии класса Эскиза особенно интересны, потому что это - также суперкласс box объекты, circle объекты и другие объекты, возвращенные другими методами элемента. graphic класс определяет свойства, характерные для всех графических объектов Эскиза, включая цвет заливки, цвет обводки, источник и размер; эти свойства реализованы, поскольку Objective C объявил свойства, синтезирующие методы доступа, получающие и устанавливающие значения свойств.

 
@interface SketchGraphic : SketchItem
@property (copy) NSColor *fillColor;  // The fill color.
@property int height;  // The height of the graphic's bounding rectangle.
@property (copy) NSColor *strokeColor;  // The stroke color.
@property int strokeThickness;  // The thickness of the stroke.
@property int width;  // The width of the graphic's bounding rectangle.
@property int xPosition;  // The x coordinate of the graphic's bounding rectangle.
@property int yPosition;  // The y coordinate of the graphic's bounding rectangle.
@end

Рисунок 1-3 показывает и это и отношение наследования SketchGraphic класс, что Пишущий сценарий Моста реализует для graphic класс.

Рисунок 1-3  graphic сценарии класса Эскиза, становящегося SketchGraphic класс
The graphic scripting class of Sketch

При установке свойства в Сценариях Моста удостоверьтесь, что значение свойства имеет надлежащий тип. Таким образом, при попытке выбрать цвет обводки a SketchGraphic объект, необходимо передать в NSColor возразите как новое значение.

Объектные спецификаторы и оценка

Пишущие сценарий объекты в программе Моста Сценариев наследовались от SBObject класс. SBObject объекты представляют объектные спецификаторы в AppleScript. Объектные спецификаторы функционируют как прокси для удаленных объектов в целевом приложении. Они помогают определить местоположение scriptable объекта в иерархии вместимости того приложения. Например, ряд сообщений, отправленных в объекты в scriptable приложении, мог быть эквивалентен оператору AppleScript такой как get the first track of the third playlist of the source “Library”. Каждый сегмент этого оператора, такой как third playlist, был бы представлен объектным спецификатором.

В программе Моста Сценариев объектные спецификаторы находятся первоначально в форме ссылки, предоставленной определением сценариев. A currentTrack сообщение отправило к iTunesApplication экземпляр, например, был бы ссылкой, такой как “‘текущая дорожка’ свойство iTunes”. При оценке объектного спецификатора, однако, событие Apple отправляется в scriptable приложение, и более точная, каноническая форма ссылки получена для объекта сценариев. Каноническая форма ссылки обеспечивает точное расположение объекта в приложении, с помощью таких вещей в качестве уникальных числовых или идентификаторов строки. В случае currentTrack, каноническая ссылка могла бы быть чем-то как “id 42 дорожки списка воспроизведения id 23 источника 1”.

Поскольку оценка объектного спецификатора приводит к отгрузке события Apple — который является дорогой работой — Пишущий сценарий Моста, ограничивает случаи та триггерная оценка. Отложенные вычисления происходят, когда данные бетона запросов сообщения, которые всегда являются значением свойства. Можно также вызвать оценку ссылки путем отправки a get обменивайтесь сообщениями к объекту сценариев. В обоих случаях оцененному объекту или объектам дают каноническую форму ссылки, не варьирующейся в течение долгого времени. (Если конкретные данные запрашиваются, сообщение также приводит к событию Apple ответа, содержащему данные.)

Часто Вы вызываете оценку, когда Вы хотите сохранить ссылку на объект в scriptable приложении, когда неканоническая форма ссылки могла измениться в любое время. Например, frontmost документ в приложении является ссылочным объектом в индексном нуле приложения documents массив элемента. Но упорядочивание документов в массиве может измениться, поскольку пользователь щелкает по различным документам. Таким образом, чтобы гарантировать, чтобы у Вас была ссылка на текущий frontmost документ, Вы могли сделать что-то подобное этому:

SketchDocument *frontmost_doc = [[[app documents] objectAtIndex:0] get];

Для больше на отложенных вычислениях и использовании get метод, посмотрите Улучшение Производительности Сценариев Кода Моста.

Классы платформы моста сценариев

Платформа Моста Сценариев имеет три общедоступных класса:

Следующие методы фабрики классов SBApplication возвратите объект, представляющий совместимое OSA приложение (автовыпущенный в управляемых средах памяти):

Вызов одного из этих методов является первым шагом при использовании Сценариев Моста. Прежде чем это возвратит экземпляр приложения, Писание сценарий Моста анализирует определение сценариев определяемого приложения и динамично реализует требуемые классы. Создание Объекта приложения показывает, как Вы могли бы использовать эти методы в своих приложениях Какао.

Программы, использующие Мост Сценариев обычно, не должны вызывать многие методы, объявленные SBObject, SBApplication, и SBElementArray. Методы, которые Вы вызываете, имеют тенденцию быть теми, что Сценарии Моста динамично объявляют и реализуют для приложения и его объектов сценариев. Однако несколько методов платформы (перечисленный в Таблице 1-1) полезны в общих ситуациях.

Таблица 1-1  Обычно вызываемые методы платформы Моста Сценариев

Методы

Цель

initWithProperties: (SBObject)

initWithData: (SBObject)

Инициализирует объект сценариев со свойствами или данными; используемый в соединении classForScriptingClass:. Посмотрите Создание и Добавление Объектов Сценариев для примера.

get (SBObject)

Оценка сил объекта сценариев, реализованного как объектный спецификатор. Оценка возвращает каноническую форму ссылки для объекта. Для получения дополнительной информации посмотрите Объектные Спецификаторы и Оценку и Перечисление 3-2.

classForScriptingClass: (SBApplication)

Возвраты Class объект для класса сценариев приложения. С этим объектом можно выделить экземпляр класса сценариев и затем инициализировать его с initWithProperties: или initWithData:.

activate (SBApplication)

isRunning (SBApplication)

Позвольте Вам контролировать и активировать приложение. Улучшение Производительности Сценариев Кода Моста обсуждает использование isRunning.

objectWithName: (SBElementArray)

objectWithID: (SBElementArray)

objectAtLocation: (SBElementArray)

Позволяет Вам получить объект сценариев в массиве элемента путем указания его имени, уникального идентификатора или расположения. Посмотрите Используя Массивы Элемента для примера.

arrayByApplyingSelector: (SBElementArray)

arrayByApplyingSelector:withObject: (SBElementArray)

Создает массив, заполненный с объектами, возвращенными из сообщения, отправленного в каждый объект в массиве элемента. Посмотрите Используя Массивы Элемента для примера.

Платформа Моста Сценариев также включает SBApplicationDelegate неофициальный протокол. Делегат может реализовать единственный метод этого протокола (eventDidFail:withError:) обрабатывать ошибки события Apple возвратилось из целевого приложения.