Javascript для автоматизации (OSA) Yosemite: ошибка привилегий для некоторых команд StandardAddition

В Yosemite теперь можно использовать JavaScript для автоматизации а также Applescript. У меня проблемы с некоторыми командами StandardAdditions. Например. из приложения «Контакты» я могу использовать displayAlert, но не displayNotification. Оба находятся в словаре StandardsAdditions. При запуске этих команд через ScriptEditor у меня не возникает этих проблем.

Для неудачных команд я получаю во время выполнения: Ошибка -10004: Произошло нарушение привилегий.

Пример кода на JavaScript:

ScriptEditor = Application("Script Editor");
ScriptEditor.includeStandardAdditions = true;

app = Application("Contacts"); // or e.g. "Calendar", "System Events", "Finder"
app.includeStandardAdditions = true;

// -- testing: displayAlert()
ScriptEditor.displayAlert("Hello world!"); 
app.displayAlert("Hello world!"); // success, no privilege error

// -- testing: displayNotification()
ScriptEditor.displayNotification("Hello world!"); 
//app.displayNotification("Hello world!"); // Error -10004: A privilege violation occurred.

// --- testing: say()
ScriptEditor.say("Hello world!");
//app.say("Hello world"); // Error -10004: A privilege violation occurred.

// --- testing: beep()
ScriptEditor.beep(1);
//app.beep(1); // Error -10004: A privilege violation occurred.

При использовании эквивалентного кода в AppleScript я не получаю ошибок нарушения привилегий:

tell application "Script Editor" to display alert "from Script Editor" -- with Script Editor icon
tell application "Contacts" to display alert "from contacts" -- with Contacts icon

tell application "Script Editor" to display notification "from Script Editor" -- with Script Editor icon
tell application "Contacts" to display notification "from contacts" -- with Script Editor icon (!)

Что я заметил в этом случае, так это то, что оповещение о контактах отображается со значком Контакты (и приложение «Контакты» активировано), но уведомление о контактах > отображается со значком Редактора скриптов (и приложение Контакты не активировано).

Использование Йосемити 10.10. Это ошибка или я что-то упускаю?


person wivku    schedule 12.11.2014    source источник
comment
Я получаю тот же результат, используя образец фрагмента Apple со страницы документа (в разделе «Добавления сценариев»), если я заменяю .currentApplication() (например, редактор сценариев) чем-либо еще. Я предполагаю, что это сделано намеренно (не может заставить другое приложение что-то говорить?), но хотелось бы, чтобы это было задокументировано с обоснованием.   -  person Ben Zotto    schedule 22.11.2014
comment
Если бы это было так, диалог и оповещение должны были бы быть ограничены аналогичным образом. Почта требует вашего пароля в качестве диалога гораздо опаснее.   -  person Michael Scott Cuthbert    schedule 26.06.2016
comment
Часть комментария @BenZotto дает практический ответ: пользователь Application.currentApplication() вместо другого приложения запускает displayNotification().   -  person Michael Scott Cuthbert    schedule 26.06.2016


Ответы (1)


Причина в том, что AppleScript использует наследование. Вы можете указать любому приложению «отобразить уведомление», но в конечном итоге вызов будет передан вверх по иерархии в редактор сценариев (или апплет сценария), который понимает сообщение. Насколько мне известно, реализация JavaScript не поддерживает наследование. Я не очень хорошо разбираюсь в JavaScript в мире OSA. :)

Вкратце: Контакты на самом деле не могут делать то, что вы пытаетесь заставить их делать, они просто работают в AppleScript, потому что AppleScript настолько удивителен. :)

Если вы посмотрите журнал ответов в редакторе сценариев, вы увидите, что наследование происходит в реальном времени.

person William T Froggard    schedule 16.03.2015
comment
Почему это работает для app.displayAlert(), но не для app.displayNotification()? - person wivku; 05.07.2016