在cocoa中集成applescript

在cocoa中集成applescript,cocoa,applescript,integrate,Cocoa,Applescript,Integrate,我已经做了一个简短的applescript,它会发送一封带有附件的电子邮件。现在我想将这个脚本集成到我的cocoa应用程序中。我尝试了在internet上找到的以下代码: NSAppleScript *mailScript; NSString *scriptString= [NSString stringWithFormat:@"the applescript"]; mailScript = [[NSAppleScript alloc] initWithSource:scriptString];

我已经做了一个简短的applescript,它会发送一封带有附件的电子邮件。现在我想将这个脚本集成到我的cocoa应用程序中。我尝试了在internet上找到的以下代码:

NSAppleScript *mailScript;
NSString *scriptString= [NSString stringWithFormat:@"the applescript"];
mailScript = [[NSAppleScript alloc] initWithSource:scriptString];
[mailScript executeAndReturnError:nil];
[mailScript release];
但是,此代码不起作用。我是cocoa的新手,需要一些帮助

更新: 电子邮件已创建。添加附件时,applescript似乎会停止。在scripteditor中运行applescript时,它可以完美地工作。有线索吗


谢谢

您的代码看起来不错。您的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
将向控制台输出一个描述任何错误的字符串。这将帮助您发现任何问题。

因此,如果您不忽略
-[NSAppleScript executeAndReturnError:
中的错误,那么错误是什么?它的内容告诉你什么地方出了问题吗

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

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

osascript -e 'applescript here';
看起来应该有用,但我以前没用过

根据:

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

以下是文件摘录:

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

尽管SBApplication包含手动发送和处理Apple事件的方法,但您不应该直接调用这些方法。相反,SBApplication的子类实现特定于应用程序的方法,自动处理Apple事件的发送

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

[iTunes propertyWithCode:'pTrk'];

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


希望有帮助

抱歉,现在回答晚了。cocoa应用程序中的Applescript可以通过一些基本原则轻松使用,首先将所有描述符设置为“NULL”,使用“NSAppleEventDescriptor”正确执行脚本,并使用executionn的返回值,该值将为脚本提供:

对于“applescript”,你没有写下你想要达到的目标 我猜这是为了隐私


-[NSAppleScript executeAndReturnError:]被记录为在发生错误时返回nil。这一点很好。。。这就是我不思考的结果你的答案更像我应该说的,所以+1。仅供参考:Adium在NSAppleScript内存泄漏方面遇到了问题。您可以尝试使用OSAKit框架中的OSAScript。该框架随Mac OS X提供,API几乎完全相同。
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];