Реализация действия AppleScript

Шаблон Xcode для проекта Действия AppleScript включает нескомпилированный названный файл сценария main.applescript. Находящееся в AppleScript действие, в минимуме, должно добавить к main.applescript код сценариев, получающий доступ к службам одного или более приложений и завершающий формулируемую цель действия. Находящееся в AppleScript действие может также полагаться на другие компоненты для своей реализации, такие как:

Независимо от возможных компонентов реализации находящееся в AppleScript действие всегда имеет a main.applescript файл и невидимый экземпляр AMAppleScriptAction. Этому экземпляру принадлежит файл пера пакета действия, имеет доступ к main.applescript, и обеспечивает, реализация по умолчанию метода раньше выполняла действие негласно, runWithInput:fromAction:error:. (AMBundleAction, суперкласс AMAppleScriptAction, объявляет этот метод.)

Структура на Обработчике команды выполнения

Шаблон main.applescript содержит только следующую скелетную структуру on run обработчик команды:

on run {input, parameters}
    -- your code goes here
    return input
end run

Это on run обработчик команды имеет два позиционных параметра, input, и parameters, input параметр содержит (в большинстве экземпляров) вывод предыдущего действия в потоке операций; это находится почти всегда в форме списка. parameters параметр содержит настройки, установленные в пользовательском интерфейсе действия; значения в parameters (рекордный объект), обычно устанавливаются через механизм привязки Какао, но может также быть вручную обновлен. Шаблон кода наконец возвращается input как его вывод; Ваше действие должно всегда возвращать что-то, как выведено, даже если это, чему дают его как ввод.

Можно использовать любую допустимую команду AppleScript, объект, ссылку, выражение и оператор в main.applescript. Однако следующие шаги предлагаются для действия run обработчик (не все шаги применимы к каждому виду действия).

Некоторые действия указывают в их AMAccepts свойство, что их ввод является дополнительным (т.е. Optional подсвойство установлено в <true/>). Эта установка позволяет пользователям выбирать «Ignore Result From Previous Action» раскрывающийся элемент в представлении действия. Если Ваше действие сделало ввод дополнительным в AMAccepts свойство, необходимо определить, сделал ли пользователь этот выбор путем тестирования ignoresInput поле parameters; если это установлено в true. тогда Вы ничего не должны делать с входным объектом.

Можно включать подпрограммы в main.applescript . Например, Вы могли бы хотеть записать подпрограмму для возврата локализованных строк (описанный в Локализованных строках).

Можно выполнить инструменты командной строки или сценарии оболочки для сценария. Следующий фрагмент сценария работает screencapture инструмент:

set screencapture to "/usr/sbin/screencapture "
-- here set up arguments of screencapture
do shell script screencapture

Протест об использовании do shell script команда состоит в том, что из-за архитектуры поточной обработки это делает пользовательский интерфейс безразличным, пока сценарий оболочки не завершается, или пользователь нажимает Command-. (период).

Сценарии действия могут также вызвать методы Objective-C, которые Вы реализовали в пользовательском классе; например, следующее утверждение вызывает названный метод класса isDVDPlayerRunning:

set dvdRunning to call method "isDVDPlayerRunning" of class "TakeScreenshot"

Гибридные Действия обсуждают действия, содержащие соединение кода Objective C и AppleScript.

Другие сценарии AppleScript

Действие AppleScript может содержать сценарии кроме main.applescript. Эти дополнительные сценарии обычно содержат два типа обработчиков:

AppleScript Studio позволяет Вам запрашивать обработчики на update parameters, parameters updated, activated, и opened команды в группе Представления Действия Automator в области AppleScript Интерфейсного инспектора Разработчика.

Как пример обработчиков событий AppleScript Studio, рассмотрите всплывающее меню для различных форматов даты. Когда пользователь выбирает элемент из этого всплывающего меню, действие изменяет пример, показывающий эффект этого изменения формата. Перечисление 1 показывает обработчик событий, вызывающийся, когда пользователь выбирает раскрывающийся элемент для сохранения снимка экрана к “Определенному Файлу”.

Перечисление 1  обработчик событий для отображения панели Save

on clicked theObject
    if name of theObject is "choose output" then
        -- Setup the properties in the 'save panel'
        tell save panel
            set title to "Choose an output file to save the screenshot to"
            set prompt to "Save"
            set required file type to "pdf"
            set treat packages as directories to false
        end tell
 
        if (display save panel in directory "" with file name "") is equal to 1 then
            set contents of text field "output file" of super view of theObject to path
                name of save panel
            set contents of popup button "output choice" of super view of theObject to 1
            set enabled of button "choose output" of super view of theObject to true
            set enabled of text field "output file" of super view of theObject to true
        end if
    end if
end clicked

Гибридные действия

Реализация действия может содержать соединение кода Objective C и AppleScript. Обычно такие гибридные действия являются находящимися в AppleScript — другими словами, у них есть a main.applescript файл, содержащий run обработчик команды. Однако возможно иметь действия Objective C, использующие классы сценариев Какао загрузки (или создающие), и выполните сценарии. Посмотрите Реализацию Действия Objective C для обсуждения последнего типа гибридного действия.

Почему Вы хотели бы создать гибридное действие? Одна причина состоит в том, чтобы иметь больший контроль над пользовательским интерфейсом. Класс Objective C, соединяющийся с Набором Приложения, имеет доступ к полному спектру программируемых ресурсов для управления появлением и поведением объектов пользовательского интерфейса.

Но возможно наиболее распространенная причина гибридных действий состоит в том, чтобы получить доступ к системным ресурсам, которые сценарий не мог получить самостоятельно. Сценарии могут вызвать методы экземпляра Objective C с call method команда, но только если целевой объект - что-то, что может адресовать сценарий (например, call method “title” of window 1). Иногда, сценарий AppleScript Studio не имеет доступа к доступному объекту для a call method команда. Для обхождения этого ограничения можно создать простой пользовательский класс, реализующий один или несколько методов класса. Первым параметром этих методов является цель (получатель) метода экземпляра, который обертывает метод класса. Перечисление 2 иллюстрирует этот подход.

Перечисление 2  Реализовывая пользовательский метод Objective C, который вызовет сценарий

#import "CreatePackageAction.h"
 
@implementation CreatePackageAction
 
+ (BOOL)writeDictionary:(NSDictionary *)dictionary withName:(NSString *)name
{
    return [dictionary writeToFile:name atomically:YES];
}
 
@end

В сценарии можно тогда использовать a call method “m” of class “c“ with parameters{y,z} оператор для вызова этого метода (Перечисление 3).

Перечисление 3  сценарий, вызывая метод Objective C

set descriptionRecord to
        {|IFPkgDescriptionTitle|:packageTitle,|IFPkgDescriptionVersion|:packageVersion,
        |IFPkgDescriptionDescription|:description,
        |IFPkgDescriptionDeleteWarning|:deleteWarning}
set rootName to call method "lastPathComponent" of rootFilePath
set descriptionFilePath to temporaryItemsPath & rootName & "description.plist"
call method "writeDictionary:withName:" of class "CreatePackageAction" with parameters
     {descriptionRecord, descriptionFilePath}

Обновление несвязанных параметров

Свойство всех действий, включая находящиеся в AppleScript, является записью (эквивалентный в Objective C к словарю) содержащий значения, отражающие, что пользователи настроек сделали в пользовательском интерфейсе действия. Когда Automator выполняет действие AppleScript путем вызова run обработчик команды, это передает в этих значениях в parameters параметр. Большинство действий использует механизм привязки Какао для установки свойства параметров. Однако можно принять решение воздержаться от привязки в пользу более прямого подхода.

Приложение Automator определяет несколько команд для AppleScript Studio. Среди них update parameters и parameters updated, который может быть присоединен к представлению действия. update parameters когда запись параметров действия должна быть обновлена от значений в пользовательском интерфейсе, команда отправляется. parameters updated когда запись параметров изменяет любое из своих значений, команда отправляется.

Для указания обработчиков для этих команд в Интерфейсном Разработчике следуйте обычной процедуре AppleScript Studio:

  1. Выберите представление действия.

  2. В области AppleScript окна Info представьте команды при Представлении Действия Automator (см. рисунок 1).

  3. Щелкните по флажкам для update parameters и parameters updated.

  4. Укажите файл сценария для обработчиков команды.

Рисунок 1  , Выбирающий связанные с параметрами обработчики для представлений действия
Selecting the parameters-related handlers for action views

Automator вызывает обработчик для update parameters непосредственно перед тем, как это выполняет действие. В этом обработчике действие должно получить настройки от пользовательского интерфейса и обновить запись параметров с ними. Перечисление 4 обеспечивает пример update parameters обработчик.

Перечисление 4  “обработчик команды” параметров обновления

on update parameters theObject parameters theParameters
    set |destinationPath| of theParameters to (the content of text field "folder path" of the destination_folder_box) as string
    set |textInput| of theParameters to (the content of text field "text input" of the text_source_box) as string
    set |fileName| of theParameters to (the content of text field "file name" of the file_name_box) as string
    set |chosenVoice| of theParameters to the title of popup button "voice popup" of voice_box
    set |textSource| of theParameters to ((the current row of matrix "source matrix" of the text_source_box) as integer) - 1
    return theParameters
end update parameters

Всегда возвращайте обновленный объект параметров как последний шаг в этом обработчике (theParameters в вышеупомянутом примере).