4

我正在尝试使用 NSAppleScript 从 Objective-C 执行一些 AppleScript ......但是,我正在尝试的代码是 Yosemite 中用于自动化的新 JavaScript。它在运行时似乎没有做任何事情,但是,正常的 AppleScript 工作正常。

[NSApp activateIgnoringOtherApps:YES];
NSAppleScript *scriptObject = [[NSAppleScript alloc] initWithSource:
                               @"\n\
                                    iCal = Application(\"Calendar\");\n\
                                    iCal.includeStandardAdditions = true;\n\
                                    iCal.activate();\n\
                                    iCal.displayAlert(\"testing\");\n\
                               "];

[scriptObject executeAndReturnError: nil];

我怎样才能让它运行?

谢谢

4

1 回答 1

8

NSAppleScript 硬连线将源代码编译为 AppleScript。您需要改用 OSAKit,这是劣质且未记录的,但至少允许您指定从源代码编译时要使用的语言。或者,您可以通过将源管道传输到 来组合解决方法osacompile -l JavaScript,然后将生成的编译.scpt文件加载到 NSAppleScript 中。

但是,从您的示例中不清楚您使用 NSAppleScript 的原因。如果您想执行用户提供的脚本,您可能应该查看 NSUserAppleScriptTask:它甚至比 NSAppleScript 更糟糕,但它旨在在应用程序沙箱之外的子进程中运行脚本。(NSAppleScript 在进程中运行脚本,这在沙盒应用程序中可防止用户脚本与任意应用程序对话。)

OTOH,如果您只使用 NSAppleScript 来运行自己的代码,那么使用 Scripting Bridge 会更好(这是蹩脚和损坏的,但如果您的需求适中,可能就足够了),或者通过 AppleScript-ObjC 使用 AppleScript bridge,它允许您的 ObjC 代码使用基于 AppleScript 的“类”,就像它们是本机 Cocoa 类一样。鉴于 AppleScript 是唯一一个知道如何正确说出 Apple 事件的受支持解决方案(JXA 也充满缺陷),我推荐后者。

于 2014-11-13T21:35:44.350 回答