运行 来自 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,但它似乎无法调用系统事件。我该如何解决这个问题?
如果应用程序被沙盒化,则会出现此错误。
您有两个选择:
- 为
System Events
添加 com.apple.security.temporary-exception.apple-events
权利
- 将脚本放在应用程序的
Application Scripts
文件夹中,然后 运行 从那里 NSUserAppleScriptTask
首先在 Xcode 中禁用“App Sandboxing”,然后尝试 Verified Answer by CRGreen
我正在制作一个简单的菜单栏应用程序来执行一些操作,例如在 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,但它似乎无法调用系统事件。我该如何解决这个问题?
如果应用程序被沙盒化,则会出现此错误。
您有两个选择:
- 为
System Events
添加com.apple.security.temporary-exception.apple-events
权利 - 将脚本放在应用程序的
Application Scripts
文件夹中,然后 运行 从那里NSUserAppleScriptTask
首先在 Xcode 中禁用“App Sandboxing”,然后尝试 Verified Answer by CRGreen