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

标签 objective-c macos cocoa sandbox scripting-bridge

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

我已经能够通过稍微修改版本的 Sketch 示例代码应用程序和一个使用脚本桥的非常简单的测试应用程序来重现该问题。我添加了 <access-group identifier="com.apple.CocoaExamples.Sketch.Draw" access="rw"/>到 Sketch.sdef 中的许多元素,以及为 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 之外,我还遗漏了什么吗?权利?这对任何人都有效吗?

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

最佳答案

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

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

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

关于objective-c - 使用 ScriptingBridge 从另一个沙盒应用程序中编写 AppleScripting 沙盒应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555415/

相关文章:

objective-c - 为表格 View (UITableView)绘制自定义单元格,更改颜色和分隔符颜色和宽度

xcode - 使用 xcodebuild 和 xcpretty 命令从 .plist 生成 html 报告

macos - 今天在 os x 通知中心小部件中显示 bash 结果

swift - Reactive Cocoa swift 3.0 上的内存泄漏

objective-c - 删除 NSTextView 上的一行文本

ios - 5X5 UIButton选择逻辑

iphone - 用户是否可以使用iPhone sdk通过LinkedIn通过好友邀请 friend ?

objective-c - 启用 AppSand 盒时如何从 USB 大容量存储设备读取数据

swift - 设置SplitViewItem的ViewController

iphone - 这个 Obj-C "unrecognized selector sent to instance"异常表示什么?