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

时间:2016-07-24 18:33:45

标签: objective-c macos cocoa sandbox scripting-bridge

我正在尝试使用ScriptingBridge从另一个沙盒应用编写沙盒应用(我写的)。我在目标应用程序的sdef中设置了访问组,并在脚本应用程序的沙盒权利中配置了权限。但是,当我尝试将Apple Events发送到目标(使用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:后,将记录“警告:无法获取脚本定义”消息,并且返回的对象是SBApplication的实例,而不是SketchApplication。< / p>

如果我在测试应用中关闭沙盒,则不会记录错误,-applicationWithBundleIdentifier:会按预期返回SketchApplication。如果我添加com.apple.security.temporary-exception.apple-events权利,情况也是如此,但我相信这不太可能通过应用商店审核。

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

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

1 个答案:

答案 0 :(得分:1)

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

我为此提交了一份雷达:rdar:// 27625862。

另一种选择是使用-applicationWithBundleIdentifier:沙盒权利。我现在就这样做,希望我可以证明它可以用于应用商店评论。