我正在尝试从沙盒式macOS应用程序中打开“系统偏好设置”,以便用户可以手动启用某个偏好设置。
AppleScript
activate
将应用程序置于最前面,必要时启动它。
我正在运行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)
我还添加了一个脚本目标沙箱权利,使“系统偏好设置”可以显示窗格:
<key>com.apple.security.scripting-targets</key>
<dict>
<key>com.apple.systempreferences</key>
<array>
<string>preferencepane.reveal</string>
</array>
</dict>
添加权利后,此方法一定有效。如果关闭了“系统偏好设置”应用程序,则会启动它并打开正确的窗格。
errorInfo
字典为nil,没有错误信息。
在控制台中,我看到一条消息,which is perhaps unrelated log spam:
AppleEvents:收到了mach msg,它不是getMemoryReference中预期的复杂类型。
但是,该应用程序未激活。系统偏好设置窗口不位于最前面。该应用程序导航到正确的选项卡,但未显示为activate
状态的文档。它保留在任何其他前景窗口的后面。
在关闭系统偏好设置的情况下,该应用程序确实会启动。但是,直到您单击停靠图标,该窗口才会添加到前景或背景中的屏幕上。然后出现一个窗口,已经导航到正确的窗格。
是否还有其他需要激活“系统偏好设置”窗口的沙盒权利?
答案 0 :(得分:1)
我建议您执行以下操作(这已由我在macOS Mojave上进行了测试,并且可以正常工作)。
Script Editor
NSAppleEventsUsageDescription
)。答案 1 :(得分:1)
对我来说似乎是个错误,脚本中不允许使用activate命令。但是,我在一个简单的测试应用程序中确认,即使我重现了您描述的行为,也可以使用NSWorkspace启动系统偏好设置来解决此问题。如果已启动该应用程序,则此过程会产生副作用。因此,在AppleScript执行之前,在 之前添加如下代码:
NSWorkspace.shared.launchApplication(withBundleIdentifier: "com.apple.systempreferences", options: [], additionalEventParamDescriptor: nil, launchIdentifier: nil)
还有其他奇怪的地方:如果您在脚本中保留了“激活”,似乎会导致正在运行的应用重新激活。因此,完整的解决方法似乎需要在代码中添加类似于上面的内容,并从脚本中删除“激活”。