使用 ScriptingBridge 从另一个沙盒应用程序中编写 AppleScripting 沙盒应用程序

AppleScripting sandboxed app from another sandboxed app using ScriptingBridge

我正在尝试使用 ScriptingBridge 从另一个沙盒应用程序编写一个沙盒应用程序(我编写的)脚本。我在目标应用程序的 sdef 中设置了访问组,并在脚本应用程序的沙箱权利中配置了权利。但是,当我尝试将 Apple 事件发送到目标(使用 ScriptingBridge)时,我看到 warning: failed to get scripting definition from ~/<snip>/MyApp.app; it may not be scriptable. 登录到控制台(目标应用程序的路径是正确的)。

我已经能够通过稍微修改版本的 Sketch 示例代码应用程序和一个使用脚本桥的非常简单的测试应用程序来重现该问题。我为 Sketch.sdef 中的许多元素添加了 <access-group identifier="com.apple.CocoaExamples.Sketch.Draw" access="rw"/>,并为 Sketch 打开了沙盒。

然后,在我的测试应用程序中,我使用以下权限打开了沙盒:

<?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.scripting-targets</key>  
    <dict>  
        <key>com.apple.CocoaExamples.Sketch</key>  
        <array>  
            <string>com.apple.CocoaExamples.Sketch.Draw</string>  
        </array>  
    </dict>  
</dict>  
</plist>  

该应用执行以下操作:

#import "ViewController.h"  
#import "Sketch.h"  

@implementation ViewController  
- (IBAction)draw:(id)sender {  
    SketchApplication *sketch = [SBApplication applicationWithBundleIdentifier:@"com.apple.CocoaExamples.Sketch"];  
    if (![sketch isKindOfClass:[NSClassFromString(@"SketchApplication") class]]) {  
        NSLog(@"Unable to get SketchApplication for Sketch");  
    }  
}  
@end

调用 -applicationWithBundleIdentifier: 时,记录 "warning: failed to get scripting definition" 消息,返回的对象是 SBApplication 的实例而不是 SketchApplication.

如果我在测试应用程序中关闭沙盒,则不会记录错误,并且 -applicationWithBundleIdentifier: returns 和预期的一样 SketchApplication。如果我加上com.apple.security.temporary-exception.apple-events entitlement也是一样的,虽然我相信这不太可能通过app store review.

除了在目标的 sdef 中定义访问组并添加 com.apple.security.scripting-targets 权利之外,我是否遗漏了一些东西?这对任何人都有效吗?

我已经在此处上传了测试应用程序和修改后的 Sketch 项目:https://www.dropbox.com/s/cdml9n5npu8o2m3/SandboxScriptTest.zip?dl=0

我就此向 Apple 提交了技术支持事件,他们确认这是一个错误。他们建议的唯一解决方法是在 Sketch 为 运行 时保留第一次调用 -applicationWithBundleIdentifier: 返回的 SketchApplication 的(有效)实例以备后用。在我的特定情况下,这根本不是一个可行的解决方法,因为目标应用程序很可能在脚本应用程序启动之前已经 运行。

我已为此提交雷达:rdar://27625862。

另一种选择是使用 com.apple.security.temporary-exception.apple-events 沙盒授权。我现在就这样做,希望我能证明它用于应用商店审查是合理的。