我的可可mac应用中使用的AppleScript在osx 10.14中停止工作

时间:2019-04-30 09:28:41

标签: swift macos applescript

我已经使用AppleScript从第三方应用程序中获取选定的文本。在osx 10.13中可以正常工作,但在osx 10.14中已停止工作。

通过搜索,有一条建议在info.plist中添加“ NSAppleEventsUsageDescription”,但这对我也不起作用。

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 个答案:

答案 0 :(得分:4)

由于您要激活“ 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 textSystem Events告诉区中,允许我成功删除delay 0.1命令。

或选项2

实际上,经过深思熟虑,如果您只想在Safari中使用它,那么下面一行AppleScript代码将满足您的需求。

您必须启用 Safari的“开发”菜单中的允许Apple事件中的JavaScript 选项,才能使用do JavaScript

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

我只解决了AppleScript部分,因为@matt彻底涵盖了他帖子中的所有其他问题。

答案 1 :(得分:2)

您在以前的系统中说“它工作得很好”。我很难相信,因为关于代码的几乎所有内容都是错误的。我更正了您的代码,并让您的脚本可以正常工作,

我会尽力描述我所做的事情。

为了准备基础,我在“脚本编辑器”中运行了一个脚本版本(当然,删除了反斜杠和字符串插值):

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

我单击确定。然后:

enter image description here

我单击了“打开系统偏好设置”。在系统偏好设置中,我检查了我的应用程序(现在同时检查了系统事件和我的应用程序):

enter image description here

现在地面已经准备充分。我退出了应用程序,然后再次运行。该脚本可以正常工作,可以在Safari中打印所选内容。