Ошибка служб, которая преждевременно активирует приложение

Я обнаружил очень странную ошибку с Services.

Чтобы увидеть это поведение, сделайте следующее:

  • Убедитесь, что Safari находится в доке.

  • Откройте Автоматизатор. Создайте новую службу.

  • Настройте службу на получение «без ввода» в «любом приложении».

  • Вставьте действие «Запустить AppleScript».

  • Вставьте следующее в действие:

    on run {input, parameters}
    
        delay 5
        display dialog "Hello"      
        tell application "Safari" to activate
    
        return input
    end run
    
  • Сохраните службу.

  • Закройте службу.

  • Повторно откройте Службу.

  • Automator должен представить вам диалоговое окно с вопросом: «Вы хотите установить службу «ServiceName»?» Нажмите «Установить».

  • Когда появится диалоговое окно «Установка завершена», нажмите «Готово».

Теперь запустите службу. Для этого нажмите на заголовок текущего приложения в верхнем левом углу экрана (второй пункт в строке меню). Затем нажмите на название услуги.

Вы заметите, что Safari немедленно откроется (о чем свидетельствует черная точка под его логотипом в Dock). Safari откроется до 5-секундной задержки и до отображения диалогового окна «Привет».

Помещение activateоператора в подпрограмму не решает проблему.

Кто-нибудь может подтвердить, что это баг? Я убежден, что это ошибка с функцией «Службы», потому что когда вы запускаете службу из Automator (нажав кнопку «воспроизведение» в правом верхнем углу окна Automator), код работает правильно.

Если это ошибка, есть ли у кого-нибудь обходной путь, чтобы приложение фактически не открывалось до запуска предыдущего кода?


Мой Macbook Pro работает под управлением OS X El Capitan, 10.11.6.


Ошибка может быть связана с другим странным поведением, которое я заметил:

  • Выйдите из Safari.app и Automator.app, если они запущены.

  • Откройте папку, в которой хранятся службы компьютера (/Users/Me/Library/Services/) в Finder.

  • Щелкните правой кнопкой мыши файл службы и откройте файл с помощью Automator.

Вы заметите, что открытие файла .workflow с помощью Automator активирует Safari. Этого не должно быть.

Я могу воспроизвести проблемы, описанные вами в OS X El Capitan 10.11.6.
Спасибо, что проверили @user3439894! Можете ли вы придумать какие-либо обходные пути?
Единственный обходной путь, который я нашел после тестирования нескольких различных сценариев, — это обернуть команды Safari внутри команды do shell script, например do shell script "osascript -e 'tell application \"Safari\" to activate'". Обратите внимание, что с помощью osascriptможно указать несколько параметров -e для создания многострочного сценария.
Это прекрасно работает! Если вы опубликуете это как ответ, я приму это. Кроме того, если вы не возражаете, не могли бы вы немного расширить это последнее предложение? Я не очень понимаю, что это значит.
Я заметил, что простая компиляция содержащего AppleScript tell application "Whatever" to ...активирует это приложение. Это, вероятно, основная причина.

Ответы (1)

Единственный обходной путь, который я нашел после тестирования нескольких различных сценариев, — это обернуть команды Safari внутри do shell script команды , например do shell script "osascript -e 'tell application \"Safari\" to activate'". Обратите внимание, что с помощью можно указать osascriptнесколько −e параметров для создания многострочного сценария.

Со страницы руководства для osascript:

−e заявление

Введите одну строку сценария. Если указано -e , osascript не будет искать имя файла в списке аргументов. Можно указать несколько параметров -e для создания многострочного сценария. Поскольку в большинстве скриптов используются специальные символы для многих программ-оболочек (например, AppleScript использует одинарные и двойные кавычки, «(», «)» и «*»), оператор должен быть правильно заключен в кавычки и экранирован, чтобы получить его. мимо оболочки нетронутой.

Пример кода AppleScript :

tell application "Safari"
    activate
    make new document in front
    set URL of front document to "http://apple.stackexchange.com/questions/271133/services-bug-that-prematurely-activates-an-application"
end tell

Пример приведенного выше кода AppleScript , написанного в виде do shell script команды с использованием osascriptпараметра -e , если необходимо.

do shell script "osascript -e 'tell application \"Safari\"' -e 'activate' -e 'make new document in front' -e 'set URL of front document to \"http://apple.stackexchange.com/questions/271133/services-bug-that-prematurely-activates-an-application\"' -e 'end tell'"

Как вы можете видеть, каждая строка кода AppleScript из tell оператора normal block представляет собой отдельную -e опцию , и, как указано на странице руководства для osascriptэтой -e опции , экранирование с помощью обратной косой черты было сделано по мере необходимости для правильной компиляции кода перед запуском. .

Другими словами, это превращает обычный tell оператор блока и включенные в него команды в однострочную do shell script команду , чтобы обойти очевидную ошибку в сценарии использования, представленном в OP.

Обратите внимание, что вы должны иметь возможность сделать то же самое с другими приложениями, вызванными той же ошибкой, заменив соответствующее имя приложения (и команды ) по мере необходимости.

Спасибо за предоставление и объяснение примера! Теперь я понимаю концепцию.