【问题标题】:Execute AppleScript file in Mac app?在 Mac 应用程序中执行 AppleScript 文件?
【发布时间】:2013-05-06 08:59:49
【问题描述】:

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

谢谢!

【问题讨论】:

  • 如果在这里搜索“[objective-c] applescript”会得到什么?

标签: objective-c macos cocoa applescript


【解决方案1】:

要在沙盒 (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 的可脚本化应用程序交互来说,它是一组相当垃圾的选择中的最佳选择。

【讨论】:

【解决方案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] );
}

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多