Запустить скрипт (AppleScript или JXA) на.app работает?
У меня есть небольшая компьютерная лаборатория, в которой студенты могут пользоваться без присмотра, с подключенным к сети принтером. Я пытаюсь реализовать простое диалоговое окно оповещения о дополнениях сценариев со всеми правилами о принтере, которые мне нужно вспомнить, когда они выбирают печать из любого числа различных приложений.
Я пытаюсь прикрепить скрипт непосредственно к самому принтеру в каталоге User/Library/Printer, (xxx.xxx.xxx.xxx.app), чтобы любой браузер или программа просмотра PDF и т. Д. Отображали сообщение при попытке запустить принтер.
Я пытался использовать automator с applecript, я пытался переименовать принтер и называть яблочный скрипт именем принтера, но пока ничего хорошего.
Что мне не хватает?
1 ответ
В этом ответе я покажу, как создать апплет JavaScript для автоматизации (JXA), который прослушивает уведомления о запуске приложения и заставке-остановке экрана, а затем отображает предупреждение при его получении, что приводит к желаемому результату, описанному в вопросе. Я также описываю, как этот подход может быть адаптирован для запуска сценария AppleScript, который приведет к конкретному поведению, описанному в заголовке вопроса.
инструкции
- Откройте приложение Script Editor и создайте новый документ
- Во всплывающем окне в верхнем левом углу окна выберите JavaScript вместо AppleScript
- Вставьте код, указанный ниже
- Сохраните скрипт как апплет, изменив "Формат файла" на "Приложение" на панели сохранения и включив опцию "Оставаться открытым после обработчика запуска".
- Запустите апплет, выбрав "Запустить приложение" в меню "Скрипт"
- Запустите приложение и обратите внимание на предупреждение
- Запустите, а затем остановите заставку и обратите внимание на предупреждение
Код
var me = Application.currentApplication(); me.includeStandardAdditions = true
ObjC.import('Cocoa')
ObjC.registerSubclass({
name: 'MainController',
methods: {
'appDidLaunch:': {
types: ['void', ['id']],
implementation: function(notification) {
var appName = notification.userInfo.objectForKey('NSApplicationName').js
me.activate()
me.displayAlert(`Hello, ${appName}!`, {message: 'Nice to meet you.'})
Application(appName).activate()
}
},
'screensaverDidStop:': {
types: ['void', ['id']],
implementation: function(notification) {
me.activate()
me.displayAlert('Goodbye, screensaver!', {message: 'It was nice knowing you.'})
}
}
}
})
var controller = $.MainController.new
$.NSWorkspace.sharedWorkspace.notificationCenter.addObserverSelectorNameObject(controller, 'appDidLaunch:', $.NSWorkspaceDidLaunchApplicationNotification, undefined)
$.NSDistributedNotificationCenter.defaultCenter.addObserverSelectorNameObject(controller, 'screensaverDidStop:', 'com.apple.screensaver.didstop', undefined)
обсуждение
Сначала код апплета создает новый класс с именем "MainController", который реализует два метода: "appDidLaunch:" и "screensaverDidStop:". Эти методы реализованы для использования функциональности "отображение оповещения" из стандартных дополнений.
Затем код апплета создает экземпляр объекта этого класса и регистрирует этот экземпляр в качестве наблюдателя уведомлений, которые публикуются при запуске приложений и при остановке хранителя экрана.
Апплет продолжает работать после выполнения кода JXA, и когда происходят события, вызываются функции JXA.
Следующие шаги
Если вы хотите запустить скрипт AppleScript из JXA, вы можете обратиться к ответу на этот вопрос.
Если вы хотите усложнить случайный выход из апплета, вы можете сделать апплет "элементом пользовательского интерфейса", установив для ключа LSUIElement значение "true" в Info.plist апплета.
Наконец, вы можете добавить апплет к элементам входа пользователя, чтобы он автоматически запускался после перезагрузки.