当我将OS X升级到10.9时,我的AppleScript不再起作用了

时间:2014-01-23 08:46:01

标签: objective-c applescript sandbox osx-mavericks nsapplescript

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

 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之前,它一直运行良好。 AppleScript的第二部分,

 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>

3 个答案:

答案 0 :(得分:4)


更新回答

在使用沙盒之后,我从未使用过一段时间后玩得很开心: 我使用了选项:

  

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

     

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

所以在Entitlements文件中。

您需要添加权利:

<强> com.apple.security.temporary-exception.apple事件

将其设为数组

然后添加两个项目。

<强> com.apple.systempreferences

<强> com.apple.systemevents

这些项目应为字符串

保存文件。

这就是我所做的全部,并且没有添加任何其他权利

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

这也显示任何应用程序,即使你告诉一个应用程序告诉另一个应用程序/进程..一些东西。这两个应用都必须在列表中


对您的设置进行细微更改可以解决您的问题:

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

com.apple.preferences。

所以你只需要将它改为正确的id com.apple.systempreferences


答案的原始部分:


如果您在评论中阅读了我提供给您的AboutAppSandbox链接。我建议,因为我认为您的应用程序已经沙箱化了。 你应该看到:

  

在辅助应用程序中使用辅助功能API使用App Sandbox,您可以   并应启用您的应用程序的可访问性,如中所述   OS X的辅助功能概述。但是,您不能沙箱   辅助应用程序,如屏幕阅读器,你不能沙盒应用程序   控制另一个应用程序。

(我自己就是这么读的)

这意味着关于辅助应用程序中的辅助功能API和sandoxing,您可以执行其中一个,但不能同时执行这两个。

然而,这也有一点,但您需要调查其影响

  

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

     

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

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

  

最后,您的应用可以使用NSUserScriptTask类的子类   从特殊目录运行用户提供的AppleScript脚本,   NSApplicationScriptsDirectory(〜/ Library / Application   脚本/代码签名标识符/)。虽然您的应用可以读取文件   在这个目录下,它无法将文件写入此目录;该   用户必须手动在此处放置脚本。有关详细信息,请参阅   NSUserScriptTask和WWDC 2012的文档:安全自动化   OS X中的技术。


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

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

答案 1 :(得分:2)

Mavericks中的新功能:系统偏好设置应用程序(包ID:“com.apple.systempreferences”)具有访问组(“preferencepane.reveal”);因此,您需要使用此访问组权利才能向系统首选项应用程序发送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团队很可能不会授予您任何脚本权限,允许您编写更改用户定义的首选项的脚本。

答案 2 :(得分:1)

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