运行 来自 Swift 的 AppleScript 不工作

Running AppleScript from Swift not working

我正在制作一个简单的菜单栏应用程序来执行一些操作,例如在 Mojave 中切换暗模式

为它写一个 AppleScript 很好,当它直接 运行 脚本时 100% 工作。为了将它实现到菜单栏应用程序中,我尝试在线搜索,我找到的唯一答案是这个 link: Can you execute an Applescript script from a Swift Application

但是,当我尝试第一个解决方案时,我在控制台中收到一条错误消息:

script: /Users/username/Documents/myscript.scpt: Operation not permitted

我的代码是这样的:

let proc = Process()
proc.launchPath = "/usr/bin/script"
proc.arguments = ["/Users/username/Documents/myscript.scpt"]
proc.launch()

我尝试了另一种解决方案,这次使用的是 NSAppleScript:

let myAppleScript = "tell application \"System Events\" \ntell appearance preferences to set dark mode to not dark mode \nend tell"
var error: NSDictionary?
if let scriptObject = NSAppleScript(source: myAppleScript) {
    if let output: NSAppleEventDescriptor = scriptObject.executeAndReturnError(&error) {
        print(output.stringValue)
    } else if (error != nil) {
        print("error: \(error)")
    }
}

但是这次我收到一条错误消息:

error: Optional({
    NSAppleScriptErrorAppName = "System Events";
    NSAppleScriptErrorBriefMessage = "Application isn\U2019t running.";
    NSAppleScriptErrorMessage = "System Events got an error: Application isn\U2019t running.";
    NSAppleScriptErrorNumber = "-600";
    NSAppleScriptErrorRange = "NSRange: {86, 9}";
})

但是如果我将脚本更改为更简单的脚本,例如 "display notification \"test\"",第二个解决方案将完美运行。

这意味着第二种解决方案可以很好地运行 AppleScripts,但它似乎无法调用系统事件。我该如何解决这个问题?

如果应用程序被沙盒化,则会出现此错误。

您有两个选择:

  1. System Events 添加 com.apple.security.temporary-exception.apple-events 权利
  2. 将脚本放在应用程序的 Application Scripts 文件夹中,然后 运行 从那里 NSUserAppleScriptTask

首先在 Xcode 中禁用“App Sandboxing”,然后尝试 Verified Answer by CRGreen