如何向我的Cocoa应用程序添加Applescript支持?

时间:2010-03-19 18:11:56

标签: objective-c cocoa applescript

我是Cocoa编程世界的新手,我想在我的应用程序中添加Applescript支持。 Apple网站上的例子似乎已经过时了。

如何向我的Cocoa应用程序添加Applescript支持?

3 个答案:

答案 0 :(得分:44)

  1. 如果您想从应用程序发送AppleScript并需要沙盒应用程序,则需要创建临时权利

  2. 您需要在info.plist中添加这两个键

    <key>NSAppleScriptEnabled</key>
    <true/>
    <key>OSAScriptingDefinition</key>
    <string>MyAppName.sdef</string>
    
  3. ...当然你必须改变&#34; MyAppName&#34;到您应用的名称

    1. 创建.sdef文件并将其添加到项目中。 进一步的课程现在很大程度上取决于您的应用程序的需求,有:

      1. 类元素(从AppleScript创建对象)
      2. 命令元素(覆盖NSScriptCommand并执行&#34;类似动词&#34;命令)
      3. 枚举元素
      4. 记录类型元素
      5. 价值类型元素(KVC)
      6. 可可元素
      7. -

        点击此处查看详细说明及其实施的详细信息:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ScriptableCocoaApplications/SApps_script_cmds/SAppsScriptCmds.html

      8. 我发现使用Class和KVC Elements非常复杂,因为我只想执行一个命令,没什么特别的。因此,为了帮助其他人,这里有一个如何使用一个参数创建一个新的简单命令的示例。在这个例子中,它会查找&#34;查找&#34;像这样的一个字符串:

        tell application "MyAppName"
            lookup "some string"
        end tell
        
      9. 此命令的.sdef文件如下所示:

        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
        
        <dictionary title="MyAppName">
            <suite name="MyAppName Suite" code="MApN" description="MyAppName Scripts">
                <command name="lookup" code="lkpstrng" description="Look up a string, searches for an entry">
                    <cocoa class="MyLookupCommand"/>
                    <direct-parameter description="The string to lookup">
                        <type type="text"/>
                    </direct-parameter>
                </command>
            </suite>
        </dictionary>
        
      10. 创建NSScriptCommand的子类并将其命名为MyLookupCommand

        MyLookupCommand.h

        #import <Foundation/Foundation.h>
        
        @interface MyLookupCommand : NSScriptCommand
        
        @end
        

        MyLookupCommand.m

        #import "MyLookupCommand.h"
        
        @implementation MyLookupCommand
        
        -(id)performDefaultImplementation {
        
            // get the arguments
            NSDictionary *args = [self evaluatedArguments];
            NSString *stringToSearch = @"";
            if(args.count) {
                stringToSearch = [args valueForKey:@""];    // get the direct argument
            } else {
                // raise error
                [self setScriptErrorNumber:-50];
                [self setScriptErrorString:@"Parameter Error: A Parameter is expected for the verb 'lookup' (You have to specify _what_ you want to lookup!)."];
            }
            // Implement your code logic (in this example, I'm just posting an internal notification)
            [[NSNotificationCenter defaultCenter] postNotificationName:@"AppShouldLookupStringNotification" object:stringToSearch];
            return nil;
        }
        
        @end
        

        基本上就是这样。这样做的秘诀是继承 NSScriptCommand 并覆盖 performDefaultImplementation 。我希望这可以帮助别人更快地完成它......

答案 1 :(得分:4)

Cocoa的现代版本可以直接解释脚本定义(.sdef)属性列表,因此您需要为基本的AppleScript支持做的就是根据文档创建sdef,将其添加到“复制包资源”阶段和在Info.plist中声明AppleScript支持。要访问NSApp以外的对象,请定义对象说明符,以便每个对象都知道它在脚本世界的层次结构中的位置。这将使您对对象属性进行kvc操作,并将对象方法用作简单的脚本命令。

答案 2 :(得分:1)

一个简单的例子,让你入门,

将脚本(命名对话框)放入文档文件夹,然后您可以从Xcode

运行它
NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDirectory = [arrayPaths objectAtIndex:0];
    NSString *filePath = [docDirectory stringByAppendingString:@"/dialog.scpt"];

     NSAppleScript *scriptObject = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:nil];

 [scriptObject executeAndReturnError:nil];

保持脚本外部的好处是能够在Xcode之外编辑它。 如果您确实开始编辑,我建议添加错误检查,因为AppleScript可能无法编译

可以查看

if(scriptObject.isCompiled){