Создание программ для Mac OS X. Часть 3: Apple Script

    В этой части я расскажу про еще одно интересное средство разработки приложений для Mac OS X — скриптового языка Apple Script.

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


    В отличии от того, как пользователь через GUI взаимодействует с приложением, например впечатывает информацию в текстовые поля приложения для работы с базами данных, AppleScript работает совсем иначе, скрипт использует внутреннюю объектную модель приложения, тем самым внося значения в саму базу данных. Это означает, что во время работы скрипта приложение даже не обязательно показывать. Естественно такая модель работы требует того, чтобы ваше приложение было написано с поддержкой Apple Script.

    Каждое приложение, которое понимает Apple Script, публикует поддерживаемые комманды в Apple Event словаре, который используется, чтобы определить допустимые комманды.

    Язык, очень похожий на натуральный


    в подкасте Радио-Т ведущий bobuk говорил что скрипт, написанный на языке Apple Script читается как обычный английский текст. В принцие он прав, т.к. это и есть одна из основополагающих особеннойстей Apple Script.

    Движок Apple Script комбинирует глаголы и существительные, чтобы выполнить действия. Например, чтобы напечатать документ, страницу из документа или опеределенный фрагмент, вместо вызова функций printPage, printDocument, printRange, мы берем глагол print и добавляем нужное существительное:
    print page 1
    print document 2
    print pages 1 thru 5 of document 2

    Чтобы работать с определенным приложением, используется слово «tell»
    tell application «iTunes»
    playpause
    end tell

    Предыдущее выражение можно записать и в одну строку
    tell application «Microsoft Word» to quit

    Для событий из «Core Suite» (активировать, открыть, открыть заново, закрыть, напечатать, выйти) можно использовать следующии инструкции:
    quit application «iPhoto»

    Конструкции могут быть вложенными:
    tell application «QuarkXPress»
    tell document 1
    tell page 2
    tell text box 1
    set word 5 to «Apple»
    end tell
    end tell
    end tell
    end tell


    Использовать иерархичность можно следующим образом:
    pixel 7 of row 3 of TIFF image «my bitmap»

    Но возможности Apple не ограничиваются управлением других приложений. С его помощью можно создать нормальное Cocoa пприложение с графическим интерфейсом и т.п. Например следующий код:
    set pix to 72
    set answer to text returned of (display dialog «Enter in the number of inches» default answer «1»)
    display dialog answer & «in = » & (answer * pix) & «px»

    при исполнии покажет диалоговое окно с запросом ввода кол-ва дюймов, потом это значение конвертируется в пиксели и результат показывается в следующем окне.

    Также скрипт можно сохранить чтобы в дальнейшем использовать как полноценное приложение. Обработчик события запуска должен находиться внутри следующей конструкции:
    on run
    — код обработчика
    end run

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

    Если бросить на файл со скриптом пару других файлов, то при запуске будет использован следующий обработчик:
    on open theItems
    — что-нибудь делаем с этими самыми theItems
    end open


    Средстав для написания скриптов лежат в /Applications/AppleScript

    В качестве редактора/интерпритатора исаользуется ScriptEditor.app

    Чтобы открыть Apple Event словарь надо в меню Script Editor нажать File=> Open Dictionary, откроется окно со списком приложений
    выбираем нужное(например iTunes) и клацаем OK. Открылось окно с описанием комманд для нужного нам приложения

    А теперь напишем простенькое Cocoa приложение, с помощью которого можно контроллировать iTunes
    Открываем XCode, File=>New Project, Cocoa Application => в Project Name пишем iTunes_Controller. Добавляем новый Objective-C class «controller». В файле controller.h пишем
    #import <Cocoa/Cocoa.h>

    interface controller: NSObject {
    }
    — (IBAction) nextClick:(id)sender;
    — (IBAction) prevClick:(id)sender;
    — (IBAction) pauseClick:(id)sender;
    — (IBAction) playClick:(id)sender;
    — (void) executeAppleScript:(NSString*)sctript;
    end

    В принципе, в этом коде ничего секретно-военного нету. Просто пишем класс, с помощью которого и будем контролировать iTunes. Функции *Click — это обработчики нажатия по соответствующим кнопочкам на форме. А executeAppleScript:(NSString*)sctript — функция, которая будет исполнять скрипт в параметре script.

    А теперь клацаем по MainMenu.nib и попадаем в InterfaceBuilder. Добавляем в окно MainMenu.nib новый NSObject и назначем ему класс controller:

    Затем разместим на форме четыре кнопки с надписями «next»,«play»,«pause»,«previous» и соеденим их с соотв. обработчиками из класса controller:

    Сохраняем все и возвращаемся в XCode. В файле controller.m пишем следующее:
    — (void) executeAppleScript:(NSString*)script {
    try {
    NSAppleScript *ascript = [[NSAppleScript alloc] initWithSource:script];
    [ascript executeAndReturnError:nil];
    [ascript release];
    }
    catch (NSException * e) {
    NSLog(@«exception:%@»,e);
    }
    }
    — (void) nextClick:(id)sender {
    [self executeAppleScript:@«tell application \»iTunes\" \n next track \n end tell"];
    }
    — (void) prevClick:(id)sender {
    [self executeAppleScript:@«tell application \»iTunes\" \n previous track \n end tell"];
    }
    — (void) playClick:(id)sender {
    [self executeAppleScript:@«tell application \»iTunes\" \n play \n end tell"];
    }
    — (void) pauseClick:(id)sender {
    [self executeAppleScript:@«tell application \»iTunes\" \n pause \n end tell"];
    }

    В принципе в этом коде ничего сложного тоже нет. Единственная интересная вещь — класс NSAppleScript, с помощью объекта которого и выполняем скрипт. Подробнее про NSAppleScript можно почитать здесь.

    В принципе, я думаю, что этого достаточно чтобы получить общее представление о Apple Script и попробавть что-нибудь на нем написать.

    P.S.: о чем бы еще было интересно почитать в плане создания приложений?
    P.P.S.: заметил, что мои статьи копипастят на других ресурсах(слава богу хоть ссылку на хабр оставляют). Я конечно не против, но если уж копипастите, то будьте добры, сообщайте об этом мне(по имейлу, хабрапочте или в каментах отпишитесь)
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 23

      0
      Интересно, Apple Script на русском получилось бы сделать? С точки зрения филолога.
        0
        я конечно и не филолог, но это было бы очень тяжело, т.к. в русском языке в предложении можно более-менее свободно менять порядок слов
        0
        эх, что-то или никто статью не заметил или никому тема создания программ под Mac OS X не интересна :(
          0
          Вот только не надо пессимизма. Интерессно.
            0
            ну тогда хоть скажите про что бы еще хотели почитать?
              0
              Да так с ходу и не скажешь. Слишком обширная тема. Например, неплохо было бы про Interface builder и классы визульных компонентов поподробнее узнать.
            0
            Статья-то очень интересна, жаль что только сейчас наткнулся. Продолжение будет еще?
              0
              про Apple Script или по общей тематике?
                0
                Меня интересует именно applescript-овое програмирование. Сам просто дизайнером работаю, и время от времени приходится делать много рутинной работы. Посему и решился за скриптование взяться.
                Ну и со временем хотелось бы это перенести в среду Xcode, т.к. есть идеи для воплощения, но нету нужных знаний пока что.
            0
            Куплю мозги программиста!
              0
              зачем?
                0
                В©ётаки я был прав размещая вакансию в камментах нестандартным способом!)))
                  0
                  понял, что вас интересует?
                    0
                    797-334 (:
                    даже у хабрастен есть уши
                      0
                      только вот проблема, у меня нету icq и заводить снова не собираюсь, так что только jabber и skype
                        0
                        невапрос! йа найду способ! (:
              0
              а я хотел бы узнать возможно ли сделать скрипт, который при подключении флэешки плеера синхронизировал ранее выбраные папки. Тоесть я подключаю флэшку, и с папки "подкасты" переносятся новые подкасты а папку "подкасты" на флэшке. За тему большое спасибо, очень люблю разные оптимизации процессов управления. Продолжай пожалуйста!!!
                0
                ну наверное можно. Надо сделать так чтобы скрипт с определнным интервалом опрашивал Finder на наличие дисков и каждый раз проверять,появилась ли флешка. Если да - то копируем
                0
                А приложение (произвольное) будет автоматически предоставлять Apple Script список возможных действий над собой? Или необходимо на уровне исходных текстов заранее обозначать возможность управлять собой через Apple Script?
                  0
                  Естественно такая модель работы требует того, чтобы ваше приложение было написано с поддержкой Apple Script
                  0
                  Спасибо, прочитал с удовольствием.
                    0
                    получилось
                      0
                      только вот блин надо написать что после редактирования файла controller.h его нужно сохранить иначе ни ка к не получается привязки сделать…
                      Так же и в предыдущей статье…

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое