使Cocoa应用程序响应简单的AppleScript命令

6

我正在尝试为Cocoa应用程序添加一个简单的AppleScript支持。该应用程序定期执行检查,我只想让它在需要时执行。

我正在尝试遵循SimpleScriptingVerbs苹果公司的示例。

我已经按照以下方式对NSScriptCommand进行了子类化:

头文件:

#import <Cocoa/Cocoa.h>

@interface rdrNotifierUpdateCommand : NSScriptCommand {

}
-(id)performDefaultImplementation;
@end

实现:

#import "rdrNotifierUpdateCommand.h"
#import "rdrNotifierAppDelegate.h"

@implementation rdrNotifierUpdateCommand

-(id)performDefaultImplementation {
  NSLog(@"Works at last");
  [((rdrNotifierAppDelegate *)[[NSApplication sharedApplication] delegate])
   checkForNewItems];  // This just fires the timer
  return nil;
}
@end

我的.sdef文件如下所示(问题似乎就在那里,但我找不到它):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary title="Dictionary" xmlns:xi="http://www.w3.org/2003/XInclude">
    <xi:include href="file:///System/Library/ScriptingDefinitions/CocoaStandard.sdef" xpointer="xpointer(/dictionary/suite)"/>
    <suite name="rdrNotifier Suite" code="rdrN" description="rdrNotifier application specific scripting facilities.">
        <command name="do update" code="rdrNUpdt" description="Check for new items">
            <cocoa class="rdrNotifierUpdateCommand"/>
        </command>
    </suite>
</dictionary>

Info.plist已经适当设置。

但是,当我尝试在AppleScript编辑器中运行以下脚本时:

tell application "rdrNotifier"
    do update
end tell

我收到一个关于变量“update”未定义的错误。

我可以从AppleScript编辑器打开我的应用程序字典(即成功注册)。

编辑:找到了解决方案

问题确实在sdef文件中:我没有指定应用程序可以回复该命令。我的最终定义如下(Obj-C代码未更改):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary title="Dictionary" xmlns:xi="http://www.w3.org/2003/XInclude">
  <!-- I have removed the standard suite as the application does not open, print... -->
  <suite name="rdrNotifier Suite" code="rdrN" description="rdrNotifier application specific scripting facilities.">
    <command name="do update" code="rdrNUpdt" description="Check for new items">
      <cocoa class="rdrNotifierUpdateCommand"/>
    </command>
    <class name="application" code="Capp">
      <cocoa class="NSApplication"/>
      <responds-to name="do update">
        <!-- Note you need to specify a method here,
             although it is blank -->
        <cocoa method=""/>
      </responds-to>
    </class>
  </suite>
</dictionary>

任何改进/提示/批评仍然受欢迎。
1个回答

2
感谢您将 AppleScript 支持添加到您的应用程序中!只是一个快速的观察/批评:在构建术语时,请务必包括空格,但如果该术语采用“动词名词”的形式(例如“do update”),则 AppleScripters 如果名词“更新”不是正确建模的对象,并且“do”不是正确的命令,则会感到烦恼。
我认为“do”是命令名称的不良选择,因为它非常含糊。使用“update”作为命令有什么问题吗?(即将其视为动词)。
这个问题在苹果自己的技术说明2106中得到了详细解释(当前位于here),如果您希望取悦您的AppleScript用户社区,那么您绝对应该阅读并消化这些内容。
苹果公司本身也不会超越愚蠢的术语选择,例如 updatePodcast 和 updateAllPodcasts(在 iTunes 中)。这些都是愚蠢的选择,因为(根据tn2106),它们不包含空格,并且更好的选择是拥有一个适当的播客类,然后拥有一个更新命令,该命令可以用于单个播客,所有播客或特定选择的播客集合。

非常感谢您指引我查看技术笔记。是的,“do update”听起来很傻;加上“do”(我本意是“执行”,但使用它也没有太大帮助)毫无意义。我已经将代码更改为单个动词,并且实际上还去掉了“update”,最终采用了“refresh”。 - Raúl Pedroche
刷新听起来很不错! :) 非常清新。 - brennanyoung
我无法看出这怎么可能是一个答案。 - Volomike
这是对原始帖子结尾处“仍然欢迎任何改进/建议/批评”的回应,顺便提到该帖子已经包含了自己的答案。 - brennanyoung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接