Техническое примечание TN1164

Сценарии дополнений для Mac OS X

Этот Technote описывает API, позволяющий разработчикам создавать AppleScript, пишущий сценарий дополнений для Mac OS X. Это направлено на разработчиков приложений, интересующихся созданием дополнений сценариев.

Этот Technote описывает API, позволяющий разработчикам создавать AppleScript, пишущий сценарий дополнений для Mac OS X. Это направлено на разработчиков приложений, интересующихся созданием дополнений сценариев.

Что Пишет сценарий Дополнений?
Упаковка дополнений сценариев
Mac OS X v10.6 (Snow Leopard) и позже: Info.plist
Mac OS X v10.5 (Leopard): Info.plist
Mac OS X v10.4 (Тигр) и ранее: Требуемые Функции
Полезные подсказки
Ссылки
Downloadables
История версии документа

Что Пишет сценарий Дополнений?

Пишущие сценарий дополнения обеспечивают механизм для поставки дополнительной функциональности, которая может использоваться в AppleScripts. Дополнение сценариев может обеспечить обработку событий Apple и обработку приведения данных о событии Apple.

Обработчики событий Apple и обработчики приведения данных о событии Apple, установленные дополнением сценариев, записаны в основном тем же способом, которым записаны обработчики, используемые в приложении. Что отличается между сценариями дополнений, и приложения упаковка кода и механизмов, которыми дополнение сценариев установлено в системе. Эти различия обсуждены в следующих разделах.

Упаковка дополнений сценариев

Пишущие сценарий дополнения упаковываются как пакеты с именем, заканчивающимся расширением .osax и a CFBundleSignature из osax.

Mac OS X v10.6 (Snow Leopard) и позже: Info.plist

Mac OS X v10.6 (Snow Leopard) использует управляемую данными схему установки обработчиков в дополнении сценариев. Более старые методы, описанные ниже, все еще поддерживаются, но Info.plist с 10.6 стилями рекомендуется по причинам производительности. Эти 10,6 форматов не обратно совместимы; дополнение, использующее его, будет только работать над Mac OS X v10.6 и позже.

Info.plist файл должен содержать a OSAXHandlers ключ, значение которого является словарем, содержащим до трех других словарей:

Значение в каждом случае является словарем, ключи которого являются кодом события с восемью символами (класс событий и ID события) или «от» и «до» DescType значения, и чьи значения являются словарями, описывающими функцию-обработчик. Учитывая эти данные, система будет заботиться об установке и удалении обработчиков для Вас: нет никакой инициализации или очистки для Вас для записи. Например, фрагмент Info.plist в Перечислении 1 объявляет обработчик для syso/dlog событие (более известный как display dialog), основанное на дескрипторе приведение для STXT к utxt, и основанное на указателе приведение для TEXT к utxt.

Перечисление 1  фрагмент Info.plist, объявляющий сценарии дополнительных функций.

<key>OSAXHandlers</key>
<dict>
    <key>Events</key>
    <dict>
        <key>sysodlog</key>
        <dict>
            <key>Handler</key>
            <string>DisplayDialogEventHandler</string>
            <key>ThreadSafe</key>
            <false/>
            <key>Context</key>
            <string>Process</string>
        </dict> 
    </dict>
    <key>DescCoercions</key>
    <dict>
        <key>STXTutxt</key>
        <dict>
            <key>Handler</key>
            <string>CoerceStyledTextToUnicodeText</string>
        </dict>
    </dict>
    <key>PtrCoercions</key>
    <dict>
        <key>TEXTutxt</key>
        <dict>
            <key>Handler</key>
            <string>CoercePlainTextToUnicodeText</string>
        </dict>
    </dict>
</dict>

Для каждого обработчика словарь содержит имя функции-обработчика, и для обработчиков событий, ее потокобезопасности и требований контекста, с помощью ключей и оценивает описанный здесь:

Табличные 1  ключи словаря Обработчика

Ключ

Описание

Обработчик

Строка; имя функции-обработчика.

ThreadSafe

Булевская переменная; действительно ли обработчик ориентирован на многопотоковое исполнение? (Обработчики событий только.)

Контекст

Строка, один из Любого, Машины, Пользователя или Процесса; требования контекста для обработчика. (Обработчики событий только.)

Обработчик

Это - имя функции-обработчика. Функция должна быть экспортирована как точка входа в исполнимую программу.

ThreadSafe

OSA и AppleScript в Mac OS X v10.6 ориентированы на многопотоковое исполнение. Если сценарий будет выполняться на фоновом потоке и вызовет обработчик событий, который не ориентирован на многопотоковое исполнение, то его вызовут на основном потоке, который медленнее, чем прямой вызов его на вызывающем потоке и может сократить скорость отклика приложения до ввода данных пользователем. Идеально, все обработчики должны быть ориентированы на многопотоковое исполнение. Некоторые по сути не могут быть; например, почти что-либо, что выводит на экран UI, должно быть выполнено на основном потоке. Вы призваны или проверить, что Ваши обработчики событий ориентированы на многопотоковое исполнение или обновляют их для создания их ориентированными на многопотоковое исполнение.

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

Контекст

Для соображений безопасности Mac OS X v10.6 только выполнит дополнения сценариев в других процессах, если это будет необходимо, и в некоторых случаях сможет попросить авторизацию прежде, чем сделать так. Точно то, как дополнение сценариев обрабатывается, зависит от значения ключа «Context», описывающего, какой контекст выполнения обработчик зависит от того, для функционирования правильно. В сценарии дополнительная команда сценариев может быть внутри a tell блок для, скажем, Mail.app на удаленной машине, но если ее «контекст» ослабляется достаточно, это будет фактически выполняться в различном процессе, представляющем меньше угрозы безопасности, обычно приложение, выполняющее сценарий. Context ключ может иметь одно из четырех значений:

Табличные 2  значения Контекста

Значение

Описание

Любой

Обработчик зависит только от его собственных входных параметров и может быть обработан в любом процессе на любой машине. (Например, смещение, вокруг.)

Машина

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

Пользователь

Обработчик зависит от пользователя и ID группы, обычно из-за предпочтений или полномочий пользователя, и должен быть обработан в некотором процессе с тем же пользователем и ID группы как целевой процесс. (Например, команды, выполняющие файловый ввод-вывод такой как открытый для доступа и информации для.)

Процесс

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

Любое значение Context подразумевает зависимости контекстов выше его, таким образом, User подразумевает Machine зависимости, и Process подразумевает User и Machine зависимости. Попытайтесь записать обработчики с как можно меньшим количеством зависимостей, начиная с большего количества средних значений зависимостей большая угроза безопасности.

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

Mac OS X v10.5 (Leopard): Info.plist

Mac OS X v10.5 (Leopard) использует идентичное Info.plist тому, описанному выше, за исключением того, что значение для записи обработчика является просто строкой, указывающей имя функции-обработчика, не словарь. Например, Перечисление 2 показывает 10.5 объявлений стиля display dialog показанный в Перечислении 1:

Перечисление 2  фрагмент Info.plist, объявляющий диалоговую команду дисплея.

<key>OSAXHandlers</key>
<dict>
    <key>Events</key>
    <dict>
        <key>sysodlog</key>
        <string>DisplayDialogEventHandler</string>
    </dict>
</dict>

Сценарии дополнительных обработчиков событий с помощью этого формата на 10,6, как предполагается, небезопасны потоком и имеют контекст «Машины».

Mac OS X v10.4 (Тигр) и ранее: Требуемые Функции

Если Ваше дополнение сценариев будет только работать на Mac OS X v10.5 или более поздние версии, то эта запись Info.plist - все, в чем Вы нуждаетесь. Если Вы хотите, чтобы он работал на более старых версиях Mac OS X, то необходимо предоставить три дополнительных функции, чтобы установить, завершиться, и подсчет ссылок дополнение сценариев.

Инициализация

Ваша подпрограмма инициализации дополнения сценариев ответственна за установку Ваших подпрограмм обработчика дополнения сценариев. Для реализации его дополнение сценариев должно экспортировать названную подпрограмму SAInitialize, который вызовет AppleScript и должен установить все событие и обработчики приведения. Перечисление 3 обеспечивает эскиз подпрограммы инициализации дополнения сценариев:

  Выборка перечисления 3 сценарии дополнительной подпрограммы инициализации.

OSErr SAInitialize(CFBundleRef additionBundle)
{
    OSErr err;

    Boolean isSysHandler = true;
    err = AEInstallEventHandler(theAEEventClass, theAEEventID, eventHandlerUPP, refcon, isSysHandler);
    err = AEInstallCoercionHandler(fromType, toType, coercionHandlerUPP, refcon, fromIsDesc, isSysHandler);

    return err;
}

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

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

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

additionBundle параметр передал SAInitialize ссылка на пакет дополнения сценариев. Это только присутствует по историческим причинам. Если обработчику нужен доступ к ресурсам пакета дополнения сценариев, это может определить местоположение использования пакета CFBundleGetBundleWithIdentifier.

Информация о ссылках пакета и формате пакета может быть найдена в разделе References в конце этой статьи.

Завершение

Ваша подпрограмма завершения дополнения сценариев ответственна за удаление Ваших подпрограмм обработчика дополнения сценариев. Для реализации его дополнение сценариев должно экспортировать названную подпрограмму SATerminate, который вызовет AppleScript и должен удалить все событие и обработчики приведения. Перечисление 4 обеспечивает эскиз подпрограммы завершения дополнения сценариев:

  Выборка перечисления 4 сценарии дополнительной подпрограммы завершения.

void SATerminate(void) {     AERemoveEventHandler(theAEEventClass, theAEEventID, gTheHandler, true);     DisposeAEEventHandlerUPP(gTheHandler);      ...other cleanup operations... }

Подпрограмма завершения может выполнить другие операции очистки, такие как высвобождение средств. Однако функция завершения никогда не будет вызываться в Leopard. Если Ваше дополнение должно выполнить, работа во время завершения процесса, такое как высвобождение средств, использует atexit(3). Примите во внимание, что много ресурсов, таких как выделенная память, будут освобождены автоматически, когда выйдет процесс.

Подсчет ссылок

Эта подпрограмма существует по историческим причинам: в классическом Mac OS было возможно разрушить систему путем удаления дополнения сценариев, в то время как это все еще работало. Поэтому сценарии дополнений экспортировали названную функцию SAIsBusy указать, были ли они заняты, и поэтому не безопасны разгрузиться. Этот возможный катастрофический отказ был решен другими средними значениями в Mac OS X v10.2, представив SAIsBusy устаревший. Это все еще должно существовать, но может просто возвратиться false, как показано в Перечислении 5.

  Выборка перечисления 5 подпрограмма SAIsBusy для дополнения сценариев.

Boolean SAIsBusy(void) {     return false; }

Полезные подсказки

Соображения во время выполнения

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

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

Определение местоположения ресурсов пакета дополнения сценариев

Сценарии дополнений, возможно, должны получить доступ к ресурсам и файлам, расположенным в их пакете. Чтобы сделать это, получите a CFBundleRef использование CFBundleGetBundleWithIdentifier, передача его идентификатор пакета Вашего дополнения сценариев.

Информация о ссылках пакета и формате пакета может быть найдена в разделе References в конце этой статьи.

Локальные и удаленные запросы

Если выполнение Вашей дополнительной команды сценариев на удаленной машине не значимо или составило бы угрозу безопасности, Ваш обработчик команды должен обнаружить и отклонить события от удаленных машин. Обработчик может определить источник события путем исследования keyEventSourceAttr атрибут во входящем событии. Событие от удаленной системы будет иметь значение атрибута kAERemoteProcess.

DescType sourceAttr;

err = AEGetAttributePtr(eventPtr, keyEventSourceAttr, typeType, NULL, &sourceAttr, sizeof(sourceAttr), NULL);
if (err != noErr || sourceAttr == kAERemoteProcess)
{
    return errAELocalOnly;
}

Ссылки

Downloadables



История версии документа


ДатаПримечания
29.05.2009

Обновленный для Mac OS X v10.6 с информацией о безопасности и потокобезопасности записи Info.plist.

24.04.2008

Добавьте демонстрационный проект.

15.01.2008

Обновление для покрытия изменений API для Leopard.

26.04.2004

Неуказанные версии содержания.

13.09.2001

Новый документ, объясняющий, как создать AppleScript, пишущий сценарий дополнений (OSAX) для Mac OS X.