在Mac应用程序中执行AppleScript文件?

时间:2013-05-12 01:03:58

标签: objective-c macos cocoa applescript

我正在寻找一种从Mac App中执行Applescript文件的方法。我之前的mac应用程序使用了NSAppleScript *script = [[NSAppleScript alloc] initWithSource: @"MY_CODE"]];,但是我的AppleScript很长,而且我希望能够将该文件作为我项目的一部分引用,然后管理它的内容(或者只是直接从我的应用程序中执行该文件。)

谢谢!

2 个答案:

答案 0 :(得分:12)

要在沙箱(10.8+)之外运行用户提供的AppleScripts,请使用NSUserAppleScriptTask

要运行应用程序包中嵌入的.scpt文件或10.7或更早版本中用户提供的脚本,请使用NSAppleScript

NSUserAppleScriptTask和NSAppleScript都有点蹩脚,请注意。它们都不提供Cocoa和AS类型之间的自动数据转换,这意味着使用NSAppleEventDescriptors进行大量手动操作以传递参数和结果。 NSAppleScript实例提供部分持久性支持:脚本的属性在多个处理程序调用中保持状态,但是无法将更改的脚本保存回磁盘,因此一旦取消分配,任何更改都将丢失。并且NSUSerAppleScriptTask是严格的一次性事件,因此在调用之间脚本状态不会持续存在。

要在应用包中嵌入AppleScript和ObjC代码之间进行更深入的集成,请使用AppleScriptObjC(10.6 +):

ASOC是一个类似于PyObjC或RubyCocoa的双向桥接器,允许您在脚本对象中编写AppleScript代码,然后将ObjC代码显示为常规Cocoa类,允许ObjC代码调用AS处理程序和AS代码调用ObjC方法。常见的ObjC和AS类型(整数,双精度,NSStrings,NSArrays等)在越过桥时会自动换行/转换,因此除了偶尔在AS侧进行投射之外,不需要额外的工作。

ASOC并不完美(苹果公司自己的文档很糟糕,桥接不是免费的,故障并不是未知),但是对于与ObjC的脚本化应用程序进行交互,它是最好的另类垃圾选择。

答案 1 :(得分:2)

为什么不将编译好的脚本或脚本文本放在包中,然后使用NSAppleScript的initWithContentsOfURL:error: method

例如:

NSError * error = NULL;
NSURL * resourceURL = [[NSBundle mainBundle] resourceURL];
NSURL * urlOfScript = [resourceURL URLByAppendingPathComponent: @"MyApplescript.scpt"];
NSAppleScript *script = [[NSAppleScript alloc] initWithContentsOfURL: urlOfScript error: &error];
if(script == NULL)
{
    NSLog( @"could not instantiate script at %@ - %@", [urlOfScript absolutePath], [error localizedDescription] );
}