У меня есть приложение Какао со словарем AppleScript, описанным в .sdef XML-файле. Все классы AppleScript, команды, и т.д. определенные в sdef, работают свойство.
За исключением мой "отправляют форму" команда. "Утверждают, что форма" команда является моей единственной командой, пытающейся передать параметр, который является произвольной хеш-таблицей информации от AppleScript до Какао. Я предполагаю, что это должно быть сделано путем передачи AppleScript record
который будет автоматически преобразован в NSDictionary
на стороне Какао.
tell application "Fluidium"
tell selected tab of browser window 1
submit form with name "foo" with values {bar:"baz"}
end tell
end tell
"Со значениями" параметр record
-> NSDictionary
параметр я испытываю затруднения из-за. Обратите внимание, что ключи записи/словаря не могут знаться/определяться заранее. Они произвольны.
Вот определение этой команды в моем sdef XML:
И у меня есть объект "вкладки", который отвечает на эту команду в sdef:
...
и Какао:
- (id)handleSubmitFormCommand:(NSScriptCommand *)cmd {
...
}
Объект "вкладки" правильно отвечает на все другие команды AppleScript, которые я определил. Объект "вкладки" также отвечает на, "отправляют форму" команда, если я не отправляю дополнительное "со значениями" параметрический усилитель. Таким образом, я знаю, что у меня есть установка основ правильно. Единственная проблема, кажется, произвольное record
->NSDictionary
параметрический усилитель.
Когда я выполняю AppleScript выше в AppleScript Editor.app
, Я получаю эту ошибку на стороне Какао:
+[NSDictionary scriptingRecordWithDescriptor:]: unrecognized selector sent to class 0x7fff707c6048
и этот на стороне AppleScript:
error "Fluidium got an error: selected tab of browser window 1 doesn’t understand the submit form message." number -1708 from selected tab of browser window 1
Кто-либо может сказать мне, что я пропускаю? Для ссылки целое приложение является открытым исходным кодом на GitHub:
Правильно -- NSD словари и записи AppleScript кажутся смешанными, но на самом деле они не используют (в NSD словарях используются объектные ключи -- скажем, строки), где записи AppleScript используют четырехбуквенные символьные коды (благодаря наследию AppleEvent/Classic Mac OS).
Смотрите этот поток в списке рассылки Apple AppleScript Implementer
Итак, что вам на самом деле нужно сделать, в вашем случае, это распаковать имеющуюся у вас AppleScript-запись и перевести ее в NSD-словарь. Вы можете написать код самостоятельно, но это сложно и погружается глубоко в менеджер AE.
Однако, на самом деле, эта работа была проделана для вас в некотором подложке для appscript/appscript-objc (appscript - это библиотека для Python и Ruby и Objective-C, которая позволяет вам общаться с приложениями AppleScriptable без необходимости использования AppleScript. appscript-objc может быть использован там, где вы бы использовали Cocoa Scripting, но имеет меньше отстойных ограничений этой технологии)
Код доступен на sourceforge. Несколько недель назад я отправил автору патч, чтобы вы могли построить JUST основу подложки для appscript-objc, что в данном случае все, что вам нужно: все, что вам нужно сделать, это упаковать и распаковать записи Applescript/AppleEvent.
Для других гуглеров есть другой способ сделать это - не использовать appscript: ToxicAppleEvents. Там есть метод, который переводит словари в записи событий Apple.