AppleScript `activate` из изолированного приложения не выводит окно на передний план

Я пытаюсь открыть системные настройки из изолированного приложения macOS, чтобы пользователь мог вручную включить определенные предпочтения.

AppleScript _ 1_

Выносит приложение на передний план, запускает его при необходимости.

Я использую macOS 10.13.6 и Xcode 10.0. В качестве цели развертывания задано OS X 10.11.

Я запускаю следующий AppleScript из изолированного приложения:

let script = """
             tell application "System Preferences"
                 activate
                 set current pane to pane id "com.apple.preferences.extensions"
             end tell
             """
let appleScript = NSAppleScript(source: script)
var errorInfo: NSDictionary? = nil
appleScript?.executeAndReturnError(&errorInfo)

Я также добавляю для сценариев цели Sandbox Entitlement, позволяющие в Системных настройках открывать панели:

<key>com.apple.security.scripting-targets</key>
<dict>
    <key>com.apple.systempreferences</key>
    <array>
        <string>preferencepane.reveal</string>
    </array>
</dict>

Это отчасти работает, когда я добавляю Entitlement. Приложение «Системные настройки» запускается, если оно закрыто, и открывает нужную панель.

Словарь errorInfo равен нулю и не содержит информации об ошибках.

В консоли я вижу сообщение возможно, это несвязанный спам в журналах:

AppleEvents: получено сообщение mach, которое не было сложным типом, как ожидалось в getMemoryReference.

Окно системных настроек не активируется и не выходит на передний план.

Однако приложение не активируется. Окно «Системные настройки» не выводится на передний план. Приложение переходит на нужную вкладку, но не выходит на передний план в качестве документов для состояния activate. Он остается за любыми другими окнами переднего плана.

В случае, когда системные настройки закрыты, приложение запускается. Но окно не добавляется к экрану на переднем или фоне, пока вы не щелкнете значок док-станции. Затем появляется окно, уже переведенное на нужную панель.

Почему приложение не активируется?

Существуют ли какие-либо другие необходимые права песочницы, которые позволят активировать окно системных настроек?


person pkamb    schedule 19.09.2018    source источник
comment
отображается ли ваше приложение на вкладке автоматизации в конфиденциальности, если нет, то сначала вам нужно добавить свое приложение в системные настройки   -  person Ron Gahlot    schedule 20.09.2018
comment
@RonGahlot Я вижу эту проблему в 10.13, связанную с Xcode 10 / 10.14 SDK. У меня нет этой вкладки Automation в 10.13.   -  person pkamb    schedule 20.09.2018


Ответы (2)


Я предлагаю вам сделать следующее (это было проверено мной на macOS Mojave и работает по назначению).

  1. Открыть Script Editor
  2. Вставьте в него свой код скрипта (конечно, без внешних кавычек)
  3. Сохраните его как приложение
  4. Перейдите в то место в Finder, где вы его сохранили, и правой кнопкой нажмите «Показать содержимое пакета».
  5. Перейдите в Contents и откройте Info.plist в Xcode.
  6. Проверьте права, которые использовало это приложение, в частности Конфиденциальность - AppleEvents Отправка описания использования (NSAppleEventsUsageDescription).
  7. Повторите это в своем приложении, но, пожалуйста, не используйте все права, которые это приложение Applescript использует по умолчанию, а только те, которые вам действительно нужны.
person jvarela    schedule 20.09.2018
comment
Я создал это приложение с помощью редактора сценариев из macOS 10.13. Сгенерированный info.plist не содержит ключа NSAppleEventsUsageDescription. Это тоже не песочница. Приложение-скрипт действительно работает правильно и активирует окно, помимо перехода к нужной панели. - person pkamb; 20.09.2018
comment
Добавление строкового значения NSAppleEventsUsageDescription в соответствии с предложением в индистеке и блог mjtsai в моем основном приложении не вызывает скрипт Apple Script чтобы активировать окно. - person pkamb; 20.09.2018
comment
Что ж, очевидно, это ошибка в macOS 10.13, и Дэниел, похоже, дал вам обходной путь. В любом случае, об этой ошибке следует сообщить. Сделайте это на bugreport.apple.com. Спасибо. - person jvarela; 21.09.2018
comment
Добавлено как rdar: // 44661897 - person pkamb; 21.09.2018

Мне кажется ошибкой, что команда активировать не разрешена из вашего скрипта. Однако в простом тестовом приложении я подтвердил, что, несмотря на то, что я воспроизвожу описанное вами поведение, проблему можно обойти, используя NSWorkspace для запуска системных настроек. Побочным эффектом этой процедуры является активация приложения, если оно уже запущено. Итак, добавьте такой код перед выполнением вашего AppleScript:

NSWorkspace.shared.launchApplication(withBundleIdentifier: "com.apple.systempreferences", options: [], additionalEventParamDescriptor: nil, launchIdentifier: nil)

Еще кое-что странное: если вы оставите «активировать» в скрипте, это, похоже, заставит запущенное приложение повторно активироваться. Таким образом, полный обходной путь, похоже, требует добавления в код чего-то вроде приведенного выше и удаления «активировать» из сценария.

person danielpunkass    schedule 20.09.2018
comment
Да, в настоящее время я использую тот же обходной путь запуска NSWorkspace, в том числе необходимость удалить команду activate, чтобы избежать сбоев. Для этого отлично работает, но меня беспокоит, что я активировал некоторые изменения AppleScript, связанные с 10.14 (как подробно описано в вашем запись в блоге), и это только первый симптом. - person pkamb; 20.09.2018