我是Cocoa编程世界的新手,我想在我的应用程序中添加Applescript支持。 Apple网站上的例子似乎已经过时了。
如何向我的Cocoa应用程序添加Applescript支持?
答案 0 :(得分:44)
如果您想从应用程序发送AppleScript并需要沙盒应用程序,则需要创建临时权利
您需要在info.plist中添加这两个键
<key>NSAppleScriptEnabled</key>
<true/>
<key>OSAScriptingDefinition</key>
<string>MyAppName.sdef</string>
...当然你必须改变&#34; MyAppName&#34;到您应用的名称
创建.sdef文件并将其添加到项目中。 进一步的课程现在很大程度上取决于您的应用程序的需求,有:
-
点击此处查看详细说明及其实施的详细信息:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ScriptableCocoaApplications/SApps_script_cmds/SAppsScriptCmds.html
我发现使用Class和KVC Elements非常复杂,因为我只想执行一个命令,没什么特别的。因此,为了帮助其他人,这里有一个如何使用一个参数创建一个新的简单命令的示例。在这个例子中,它会查找&#34;查找&#34;像这样的一个字符串:
tell application "MyAppName"
lookup "some string"
end tell
此命令的.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>
创建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){