以下代码尝试打开代理设置对话框
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>
答案 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保护。请参阅“系统偏好设置”,“安全和隐私”,“辅助功能”。在这里,您可以添加允许(或不允许)控制计算机的应用程序。我想你必须在这里添加你的应用程序。