AppleScript, используемый в моем приложении mac mac, перестал работать в OSX 10.14 - PullRequest
1 голос
/ 30 апреля 2019

Я использовал AppleScript, чтобы получить выделенный текст из стороннего приложения.Который работает нормально в OSX 10.13, но перестал работать в OSX 10.14.

В результате поиска было получено одно предложение добавить «NSAppleEventsUsageDescription» в info.plist, но это также не работает для меня.

let latestApp = "Safari"

        //Write script to activate the app and get the selected text to our app
        let script = """
        tell application \"\(latestApp)\"
        activate
        end tell
        tell application \"System Events\"
        tell process \"\(latestApp)\"
        keystroke \"c\" using {command down}
        delay 0.1
        set myData to (the clipboard) as text
        return myData
        end tell
        end tell
        """
        let scriptObject = NSAppleScript.init(source: script)
        let errorDict: AutoreleasingUnsafeMutablePointer<NSDictionary?>? = nil
        var returnDescription:NSAppleEventDescriptor? = nil
        returnDescription = scriptObject?.executeAndReturnError(errorDict)
        if( returnDescription != nil ){
            if( kAENullEvent != returnDescription?.descriptorType ){ //successful execution
                if( cAEList == returnDescription?.descriptorType ){
                    print("return  value")
                }else{
                    print("Returned string : \(String(describing: returnDescription?.stringValue))")
                    let selectedStr = returnDescription?.stringValue!
                    if( (selectedStr?.count)! > 0 ){
                        print("selectedStr is :\(String(describing: selectedStr))")
                    }
                }
            }

        }else{
            print("Error is : \(String(describing: errorDict))")

        }

Отлично работает в OS 10.12 & 10.13 и ScriptEditorтакже.

enter image description here

Ответы [ 2 ]

4 голосов
/ 01 мая 2019

Поскольку вы говорите «Safari» для активации, наличие "System Events" to tell process "Safari" ... не обязательно. Простое использование "System Events" до keystroke "c" using {command down} делает то же самое. Это не большое дело, но устранение ненужных строк кода здесь и там делает навигацию по коду легче и чище. Кроме того, без добавления дополнительного delay 0.3 перед командой keystroke "c" using {command down} в моей системе возвращался пустой буфер обмена в 50% случаев.

Этот код AppleScript работает для меня, используя последнюю версию macOS Mojave.

tell application "Safari" to activate
delay 0.2 -- Adjust As Needed
tell application "System Events" to keystroke "c" using {command down}
set myData to (the clipboard) as text

Поскольку команды clipboard обрабатываются Стандартными дополнениями , а не Системные события (как упомянуто @ user3439894 в его комментарии), удаляя set myData to (the clipboard) as text из System Events рассказать блок, позволил мне успешно удалить команду delay 0.1.

ИЛИ ВАРИАНТ 2

На самом деле, если подумать, если вы хотите использовать это только в Safari, эта следующая строка кода AppleScript сделает то, что вам нужно.

Вы должны включить Разрешить JavaScript от Apple Events в Меню разработки Safari , чтобы использовать do JavaScript.

tell application "Safari" to set myData to (do JavaScript "''+document.getSelection()" in document 1)

Я затронул только часть AppleScript, потому что @matt подробно рассмотрел все остальные проблемы в своем посте.

2 голосов
/ 01 мая 2019

Вы говорите, что «это работало отлично» в предыдущих системах.Мне трудно в это поверить, поскольку почти все в вашем коде неверно.Я исправил ваш код и заставил ваш скрипт работать без особых затруднений.

Я постараюсь описать, что я сделал.

Чтобы подготовиться, я запустил версию вашего скриптав редакторе скриптов (конечно, удаляя обратную косую черту и интерполяцию строк):

tell application "Safari"
    activate
end tell
tell application "System Events"
    tell process "Safari.app"
        keystroke "c" using {command down}
        delay 0.1
        set myData to (the clipboard) as text
        return myData
    end tell
end tell

Сначала скрипт не запускался, но диалоговое окно отправило меня в «Системные настройки» -> «Безопасность и конфиденциальность» -> «Доступность», гдеЯ проверил Редактор скриптов и системные события.

enter image description here

Теперь я был готов создать приложение.Мое приложение называется AnotherAppleScriptExample.В своих правах песочница имеет номер NO.

enter image description here

В ее Info.plist есть эта запись:

enter image description here

Моя версия вашего кода (исправление различных ошибок Swift) такова:

        let app = "Safari.app"
        let script = """
        tell application "\(app)"
            activate
        end tell
        tell application "System Events"
            tell process "\(app)"
                keystroke "c" using {command down}
                delay 0.1
                set myData to (the clipboard) as text
                return myData
            end tell
        end tell
        """
        if let scriptObject = NSAppleScript(source: script) {
            var error: NSDictionary? = nil
            let result = scriptObject.executeAndReturnError(&error)
            if( kAENullEvent != result.descriptorType ){
                print(result.stringValue as Any)
            }
        }

Я запустил приложение.У меня есть два диалога.Сначала это:

enter image description here

Я нажал OK.Тогда это:

enter image description here

Я нажал Открыть системные настройки.В Системных настройках я проверил свое приложение (теперь проверяются и системные события, и мое приложение):

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...