将applescript整合到可可中

时间:2009-06-16 18:36:20

标签: cocoa applescript integrate

我做了一个简短的AppleScript,发送带附件的电子邮件。现在我想在我的cocoa应用程序中集成这个脚本。我尝试了以下在互联网上找到的代码:

NSAppleScript *mailScript;
NSString *scriptString= [NSString stringWithFormat:@"the applescript"];
mailScript = [[NSAppleScript alloc] initWithSource:scriptString];
[mailScript executeAndReturnError:nil];
[mailScript release];

但是,此代码不起作用。我是可可的完全新手,可以使用一些帮助。

更新: 电子邮件已创建。虽然添加了附件,但AppleScript似乎停止了。当在脚本编辑器中运行时,applescript工作正常。任何线索?

由于

5 个答案:

答案 0 :(得分:5)

所以当你不忽略-[NSAppleScript executeAndReturnError:]的错误时,错误是什么?它的内容是否告诉你什么出了什么问题?

NSDictionary *dict = nil;
if ([mailScript executeAndReturnError: &dict] == nil)
{
  //ooh, it went wrong, look at dict
}
else
{
  // well, that worked!
}

答案 1 :(得分:1)

您的代码看起来不错。您的AppleScript可能存在错误。

尝试以下方法:

NSAppleScript *mailScript;
NSAppleEventDescriptor *resultDescriptor;
NSString *scriptString= [NSString stringWithFormat:@"the applescript"];
mailScript = [[NSAppleScript alloc] initWithSource:scriptString];
resultDescriptor = [mailScript executeAndReturnError:nil];
NSLog([resultDescriptor stringValue]);
[mailScript release];

NSLog将向控制台输出描述任何错误的字符串。这可以帮助您找到任何问题。

答案 2 :(得分:1)

如果需要时间到达应用程序中的正确位置并且您只想测试Applescript,可以通过osascript命令从终端运行它,并查看结果:

osascript -e 'applescript here';

答案 3 :(得分:0)

似乎SBApplication应该可以使用,但我之前没有使用它。

根据@cocoadevcentral

  

SBApplication:用于使用Objective-C而不是AppleScript进行跨应用程序脚本调用。例如:获取当前的iTunes曲目。

以下是文档的摘录:

  

SBApplication类提供了一种机制,使Objective-C程序能够将Apple事件发送到可编写脚本的应用程序并接收Apple事件作为响应。因此,该程序可以控制应用程序并与之交换数据。 Scripting Bridge的工作原理是在Apple事件描述符和Cocoa对象之间桥接数据类型。

     

虽然SBApplication包含手动发送和处理Apple事件的方法,但您永远不必直接调用这些方法。相反,SBApplication的子类实现了特定于应用程序的方法,可以自动处理Apple事件的发送。

     

例如,如果你想获得当前的iTunes曲目,你可以简单地使用动态定义的子类的currentTrack方法为iTunes应用程序 - 它处理发送Apple事件的细节 - 而不是找出更复杂,更低级别的选择:

[iTunes propertyWithCode:'pTrk'];
     

如果您确实需要手动发送Apple事件,请考虑使用NSAppleEventDescriptor类。

希望有所帮助!

答案 4 :(得分:0)

抱歉,回答已经很晚了。可可应用程序中的Applescript可以轻松地使用一些基本原则,首先将所有描述符设置为“NULL”,使用“NSAppleEventDescriptor”进行正确的脚本执行,并使用executen的返回值来为脚本提供:

  
NSString * scriptString = NULL, NSString * retvalue = NULL;

NSAppleEventDescriptor * descriptor = NULL;

NSDictionary * errInfo = nil;

NSAppleScript * mailScript = NULL;

scriptString = [NSString stringWithFormat: @ "the applescript"];

mailScript = [[NSAppleScript alloc] initWithSource: scriptString];

descriptor = [mailScript executeAndReturnError: & errInfo];

retvalue = [descriptor stringValue];

[mailScript release];   
  
     

对于“苹果”,你没有写下你想要达到的目标   猜它是为了隐私。