Как запустить JavaScript/AppleScript из приложения какао?

Я пытаюсь выполнить некоторый AppleScript из Objective-C, используя NSApleScript... однако код, который я пытаюсь использовать, — это новый JavaScript для автоматизации в Yosemite. При запуске он ничего не делает, однако обычный AppleScript работает нормально.

[NSApp activateIgnoringOtherApps:YES];
NSAppleScript *scriptObject = [[NSAppleScript alloc] initWithSource:
                               @"\n\
                                    iCal = Application(\"Calendar\");\n\
                                    iCal.includeStandardAdditions = true;\n\
                                    iCal.activate();\n\
                                    iCal.displayAlert(\"testing\");\n\
                               "];

[scriptObject executeAndReturnError: nil];

Как я могу заставить это работать?

Спасибо


person Brian Peters    schedule 09.11.2014    source источник


Ответы (1)


NSApleScript запрограммирован на компиляцию исходного кода как AppleScript. Вместо этого вам нужно будет использовать OSAKit, который некачественный и недокументированный, но, по крайней мере, позволяет вам указать, какой язык использовать при компиляции из исходного кода. В качестве альтернативы вы можете найти обходной путь, передав исходный код в osacompile -l JavaScript, а затем загрузив полученный скомпилированный файл .scpt в NSApleScript.

Однако из вашего примера неясно, почему вы используете NSApleScript. Если вы хотите выполнять пользовательские сценарии, вам, вероятно, следует взглянуть на NSUserAppleScriptTask: он даже хуже, чем NSAppleScript, но он предназначен для запуска сценария в подпроцессе вне песочницы вашего приложения. (NSAppleScript запускает сценарии в процессе, что в изолированном приложении предотвращает взаимодействие пользовательских сценариев с произвольными приложениями.)

OTOH, если вы используете NSAppleScript только для запуска своего собственного кода, вам было бы намного лучше использовать Scripting Bridge (который дрянной и сломанный, но может быть достаточным, если ваши потребности скромны) или использовать AppleScript через мост AppleScript-ObjC, который позволяет вашему коду ObjC используйте «классы» на основе AppleScript так же, как если бы они были родными классами Cocoa. Учитывая, что AppleScript — единственное поддерживаемое решение, которое знает, как правильно говорить о событиях Apple (JXA тоже изобилует недостатками), я бы рекомендовал последнее.

person foo    schedule 13.11.2014