如何从cocoa app运行JavaScript / AppleScript?

我正在尝试使用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];

我怎么能让它运行?

谢谢

解决方法:

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

但是,从您的示例中不清楚为什么使用NSAppleScript.如果你想执行用户提供的脚本,你应该看看NSUserAppleScriptTask:它甚至比NSAppleScript更糟糕,但是它被设计为在应用程序沙箱外的子进程中运行脚本. (NSAppleScript在进程中运行脚本,它在沙盒应用程序中阻止用户脚本与任意应用程序通信.)

OTOH,如果您只使用NSAppleScript来运行自己的代码,那么使用Scripting Bridge会更好(这可能很糟糕,但如果您的需求适中则可能就足够了),或者use AppleScript via the AppleScript-ObjC bridge,它允许您的ObjC代码使用基于AppleScript的“类”就像它们是本机Cocoa类一样.鉴于AppleScript是唯一支持的解决方案,它知道如何正确地讲Apple事件(JXA也充满了瑕疵),我推荐后者.

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...