У меня есть приложение Амфетамин для Mac и вот официальная документация для управления им с помощью AppleScript. У меня есть этот скрипт, где каждые почти 5 минут он создает новый сеанс на 5 минут, но также проверяет, открыта ли крышка, и если да, то он спросит, хотите ли вы продолжить.
Проблема в том, что когда я сохраняю AppleScript как файл .app и помещаю его в свою док-станцию, я не могу выйти из него, когда щелкаю правой кнопкой мыши и выбираю «Выход». Как я могу это сделать? Я сделал кучу Google для ответов, но я не нашел никаких решений.
tell application "Amphetamine" to start new session with options {duration:5, interval:minutes, displaySleepAllowed:false}
repeat while true
tell application "Amphetamine" to start new session with options {duration:5, interval:minutes, displaySleepAllowed:false}
set lid to do shell script "ioreg -r -k AppleClamshellState -d 4 | grep AppleClamshellState"
if lid contains "no" then
set notification to display alert "Keep Mac Awake" message "The lid is opened. Would you like to stop?" buttons ["Continue", "Stop"] default button 2
if button returned of notification is equal to "Stop" then
tell application "Amphetamine" to end session
exit repeat
end if
end if
delay 290
end repeat
Лучшее решение в этом случае - не использовать бесконечный цикл повторения, а приложение, остающееся открытым, с обработчиками on idle() и on quit(). Сохраните следующий скрипт как приложение с постоянным открытием, а затем попробуйте его. Я не могу проверить, потому что приложение Amphetamine.app не установлено на моем Mac.
on idle {}
tell application "Amphetamine" to start new session with options {duration:5, interval:minutes, displaySleepAllowed:false}
set lid to do shell script "ioreg -r -k AppleClamshellState -d 4 | grep AppleClamshellState"
if lid contains "no" then
tell application "System Events" to set frontProcess to 1st process whose frontmost is true
tell frontProcess to set notification to display alert "Keep Mac Awake" message "The lid is opened. Would you like to stop?" buttons ["Continue", "Stop"] default button 2
if button returned of notification is equal to "Stop" then quit {}
end if
return 290
end idle
on quit {}
tell application "Amphetamine" to end session
continue quit
end quit
Обновление: добавлено определение переднего процесса для отображения предупреждения на переднем плане.
Я скопировал и вставил это в редактор сценариев, экспортировал в виде файла .app и добавил в свою док-станцию. Он немедленно закрывается, и ни Aphetamine не запускает сеанс, ни я не получаю сообщения с открытой крышкой (поэтому я думаю, что ничего не происходит). Ничего не происходит и в редакторе сценариев.
Сохраните скрипт не как приложение, а как постоянное приложение!
Постоянные операторы
repeat
иdelay
не позволяют системе обрабатывать события, поэтому пользовательский интерфейс блокируется. Вы должны использовать таймер (NSTimer) или обработчик idle (который использует таймер) вместо повтора/задержки.