2016-07-24 108 views
3

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

我已经能够使用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

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

我错过了定义目标sdef中的访问组并添加com.apple.security.scripting-targets权利的内容吗?这对任何人都适用吗?

我上传的测试程序和修改我的素描这里的项目:https://www.dropbox.com/s/cdml9n5npu8o2m3/SandboxScriptTest.zip?dl=0

+0

看来只有当目标应用程序已经*运行时才会发生这种情况;否则它会起作用。 –

+0

这很有趣。在我的测试应用程序中,如果Sketch未运行,单击Draw按钮将打开Sketch,并调用“-applicationWithBundleIdentifier:'成功。但是,在下一次单击,现在Sketch正在运行时,它将失败。 –

+0

是的,奇怪的是,它实际上第一次运作,实际上不需要临时例外授权。 –

回答

1

我提交了一份技术支持事件与苹果关于这一点,他们确认这是一个错误。他们建议的唯一解决方法是在Sketch运行以供将来使用时,保持第一次调用-applicationWithBundleIdentifier:时返回的SketchApplication的(有效)实例。在我的情况下,这完全不是一个可行的解决方法,因为在脚本应用程序启动之前目标应用程序很可能已经运行。

我已经为此提交了一个雷达:rdar:// 27625862。

另一个选项是使用沙盒权利。我现在会这样做,并希望我可以证明它用于应用商店评论。

+0

在进一步研究这个问题时,似乎'com.apple.security.temporary-exception.apple-events'实际上不起作用。不知道为什么当我写下原始问题时我认为这是真的。 –

+0

它在AppleScript中可以正常工作吗? SB在设计上有缺陷和残缺,因此尽管在AS中工作良好,但SB中的内容并不少见。如果是这样的话,答案就是通过AppleScript-ObjC桥来挑选SB并使用AS,它允许您与AS脚本对象和处理程序进行交互,就像本地Cocoa类和方法一样。[Quick HowTo here](http://appscript.sourceforge.net/asoc.html)。 OTOH,如果沙箱系统中存在bug,那么你可能塞满了苹果,直到苹果从源头上修复它。 (p.s.考虑在[OpenRadar](http://openradar.appspot.com)上张贴您的票证以供参考。) – foo

+0

果然,使用NSAppleScript来运行常规脚本可以正常工作。使用ASOC对我来说可能是矫枉过正的。这太糟糕了SB在这里工作不好。理论上这是一个非常好的主意。谢谢! –