沙盒应用程序中的AppleScript“activate”无法将窗口置于前台

5
我正在尝试从沙盒化的 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 字典为空,并且没有错误信息。
在控制台中,我看到一个消息,可能是无关的日志垃圾

AppleEvents:在 getMemoryReference 中接收到了不是预期的复杂类型的 mach 消息。

System Preferences window does not activate or come to foreground.

然而,该应用程序未能激活。系统偏好设置窗口没有出现在前台。该应用程序导航到正确的选项卡,但不像“激活”文档所述那样浮现在前景中。它停留在任何其他前景窗口后面。
如果系统偏好设置已关闭,则该应用程序确实会启动。但是,在单击 dock 图标之前,该窗口不会添加到前台或后台屏幕。然后,窗口会出现,已经导航到正确的选项卡。
为什么应用程序不能激活?
是否还需要其他沙盒授权才能激活系统偏好设置窗口?

如果您的应用程序未显示在隐私的自动化选项卡中,则需要先将其添加到系统偏好设置中。 - Ron Gahlot
@RonGahlot,我在10.13中使用Xcode 10 / 10.14 SDK时遇到了这个问题。但是我在10.13中没有Automation选项卡。 - pkamb
2个回答

1
我建议你按照以下步骤操作(经过我在macOS Mojave上的测试,可以正常工作):
  1. 打开 Script Editor
  2. 将你的脚本代码粘贴进去(当然不包括外部引号)
  3. 将其保存为一个应用程序
  4. 在Finder中找到你保存的位置,在该位置右键单击“显示包内容”。
  5. 进入Contents并在Xcode中打开Info.plist
  6. 检查此应用程序使用的权限,特别是隐私 - AppleEvents发送使用说明 (NSAppleEventsUsageDescription)。
  7. 在你的应用程序中复制它,但请不要使用此Applescript应用程序默认使用的所有权限,只使用你真正需要的权限。

我使用macOS 10.13的Script Editor创建了该应用程序。生成的info.plist不包含NSAppleEventsUsageDescription键。它也没有进行沙盒化。脚本应用程序确实可以正确工作并激活窗口,此外还可以导航到正确的面板。 - pkamb
将建议在IndieStackmjtsai博客中添加的NSAppleEventsUsageDescription字符串值添加到我的主应用程序中,并不会导致Apple脚本激活窗口。 - pkamb
显然,这是macOS 10.13中的一个bug,而且Daniel似乎已经给了你一个解决方法。无论如何,应该报告这个bug,请在bugreport.apple.com上进行报告。谢谢。 - jvarela
已添加为 rdar://44661897。 - pkamb

1
我认为,你的脚本无法使用激活命令似乎是一个错误。但是,在一个简单的测试应用程序中,我确认了即使我重现了你所描述的行为,问题可以通过使用NSWorkspace来启动系统偏好设置而得到解决。这个过程会有一个副作用,如果应用程序已经启动,它会激活该应用程序。因此,在你的AppleScript执行之前添加以下代码: NSWorkspace.shared.launchApplication(withBundleIdentifier: "com.apple.systempreferences", options: [], additionalEventParamDescriptor: nil, launchIdentifier: nil) 还有一些奇怪的事情:如果你在脚本中保留"activate",它似乎会导致正在运行的应用程序重新激活。因此,完整的解决方法似乎需要在代码中添加类似上面的内容,并从脚本中删除'activate'。

是的,我目前正在使用相同的NSWorkspace启动解决方法,包括需要删除“activate”命令以避免出现故障行为。对于这个问题来说效果很好,但我担心我现在已经激活了一些与10.14相关的AppleScript更改(如您的博客文章中所述),这只是第一个症状。 - pkamb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接