7

以下代码试图打开代理设置对话框,

 NSAppleScript *a = [[NSAppleScript alloc] initWithSource:@"tell application \"System Preferences\"\nset current pane to pane \"com.apple.preference.network\"\nactivate\nend tell\ntell application \"System Events\" to tell process \"System Preferences\" to tell window 1\n click button -3\nclick radio button -2 of tab group 1 of sheet 1\nend tell"];
    [a executeAndReturnError:nil];  

在我将 Mac OS 升级到 10.9 之前,它一直运行良好。苹果脚本的第二部分,

 tell application \"System Events\" to tell process \"System Preferences\" to tell window 1\n click button -3\nclick radio button -2 of tab group 1 of sheet 1\nend tell 

它不再起作用了。所以如果有人能告诉我原因,我将不胜感激。


编辑:这是我的 .entitlements 文件信息,

  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-write</key>
    <true/>
    <key>com.apple.security.network.client</key>
    <true/>
    <key>com.apple.security.network.server</key>
    <true/>
    <key>com.apple.security.scripting-targets</key>
        <dict>
            <key>com.apple.preference</key>
            <array>
                <string>com.apple.preference</string>
                <string>com.apple.systemevents</string>
            </array>
        </dict>
    <key>com.apple.security.temporary-exception.apple-events</key>
        <array>
            <string>com.apple.preference</string>
            <string>com.apple.systemevents</string>
        </array>
</dict>
</plist>
4

3 回答 3

5

更新答案

在玩了一些我以前从未使用过的沙盒之后,好吧:我使用了这个选项:

但是,对于专门提供脚本访问组的应用程序,如果您的应用程序包含脚本目标权限,您可以向这些应用程序发送适当的 Apple 事件。

对于其他应用程序,通过使用临时异常权利,您可以启用将 Apple 事件发送到您指定的特定应用程序列表,如权利密钥参考中所述。

所以在权利文件中。

您需要添加权利:

com.apple.security.temporary-exception.apple-events

将其设置为数组

然后添加两个项目。

com.apple.systempreferences

com.apple.systemevents

这些项目应该是字符串

保存文件。

这就是我所做的一切,没有添加其他权利

在我的测试中,系统首选项打开并选择了代理选项卡。

这也向您显示任何应用程序,即使您告诉一个应用程序告诉另一个应用程序/进程..做某事。两个应用程序都必须在列表中


对您的设置稍作更改应该可以解决您的问题:

通过这样做,我注意到在您的编辑中您显示您已添加:

com.apple.preferences。

因此,您只需要将其更改为正确的 id,即com.apple.systempreferences


答案的原始部分:


如果您阅读了我在评论中为您提供的AboutAppSandbox链接。我假设您的应用程序已经被沙盒化,因此我建议这样做。你应该看过:

在辅助应用程序中使用辅助功能 API 使用 App Sandbox,您可以并且应该启用应用程序的辅助功能,如 OS X 辅助功能概述中所述。但是,您不能对辅助应用程序(例如屏幕阅读器)进行沙箱处理,也不能对应用程序进行沙箱处理控制另一个应用程序。

(我真的只是自己读过这个)

这意味着关于辅助应用程序中的可访问性 API 和 Sandoxing,您可以做其中之一,但不能同时做两者。

然而,也有这一点,但你需要调查它的含义

但是,对于专门提供脚本访问组的应用程序,如果您的应用程序包含脚本目标权限,您可以向这些应用程序发送适当的 Apple 事件。

对于其他应用程序,通过使用临时异常权利,您可以启用将 Apple 事件发送到您指定的特定应用程序列表,如权利密钥参考中所述。

进一步阅读还有另一种可能的方法

最后,您的应用程序可以使用 NSUserScriptTask 类的子类从特殊目录 NSApplicationScriptsDirectory (~/Library/Application Scripts/code-signing-identifier/) 运行用户提供的 AppleScript 脚本。虽然您的应用程序可以读取此目录中的文件,但无法将文件写入此目录;用户必须在此处手动放置脚本。有关详细信息,请参阅 NSUserScriptTask 和 WWDC 2012:OS X 中的安全自动化技术的文档。


您使用的策略不是我想要的应用程序。而且我认为使用这样的 GUI 会给它留下很大的失败空间。要么是因为 GUI 中的元素树更改,要么是用户交互将注意力从系统事件的预期目标上移开。

我认为更好的方法是通知用户自己更改代理。

于 2014-01-24T11:27:54.153 回答
3

Mavericks 的新功能:系统偏好设置应用程序(bundle id:“com.apple.systempreferences”)有一个访问组(“preferencepane.reveal”);因此,您需要使用此访问组权限才能向系统偏好设置应用程序发送显示命令:

<key>com.apple.security.scripting-targets</key>
<dict>
    <key>com.apple.systempreferences</key>
    <array>
        <string>preferencepane.reveal</string>
    </array>
</dict>

您可以使用 sdef 工具确定可编写脚本的应用程序访问组(参见手册页)。

Mac App Review 团队很可能不会授予您任何允许您编写脚本更改用户定义的首选项的脚本权限。

于 2014-02-11T18:01:18.073 回答
1

这些脚本受 OS X 保护。请参阅“系统偏好设置”、“安全和隐私”、“可访问性”。您可以在此处添加允许(或不允许)控制您的计算机的应用程序。我想你必须在这里添加你的应用程序。

于 2014-01-23T16:14:32.323 回答