7

我正在寻找一种从 Mac 应用程序中执行 Applescript 文件的方法。我已经制作了以前使用的mac应用程序NSAppleScript *script = [[NSAppleScript alloc] initWithSource: @"MY_CODE"]];,但是我的applescript很长,我希望能够将该文件作为我项目的一部分引用,并通过管道输入它的内容(或者直接从在我的应用程序中)。

谢谢!

4

2 回答 2

12

要在沙箱 (10.8+) 之外运行用户提供的 AppleScript,请使用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 并不完美(Apple 自己的文档很烂,桥接不是免费的,而且故障也不是未知的),但对于与 ObjC 的可脚本应用程序进行交互,它是一组相当垃圾的选择中的最佳选择。

于 2013-05-12T12:00:50.887 回答
2

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

例如:

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] );
}
于 2013-05-12T01:40:50.640 回答