Voj*_*jto 2 applescript objective-c
所以我正在开发我的小Mac应用程序,我想用它来控制Adium.AppleScript非常酷:
tell application "Adium"
go away with message "Zoned in for Maths."
end tell
Run Code Online (Sandbox Code Playgroud)
(如果你想知道这应该是什么.为了真正开始学习,我需要创建一个可以改变我的IM状态的应用程序,当然......)
我在脚本编辑器中尝试过它,它很有用,而且我很确定从Cocoa应用程序调用AppleScript会非常简单.
但.
AppleScript是唯一的方法吗?我不介意使用AppleScript,但它看起来像是为noobs编程.
有没有办法像上面的代码那样做没有AppleScript的东西,在纯粹的Objective-C中以某种方式?
有人会指出我的相关文件吗?我试过谷歌,但就像我甚至不知道我在寻找什么.
谢谢!
Yuj*_*uji 10
Mac OS X中的进程间通信是通过Apple Events进行的.AppleScript是向其他应用程序发送和接收Apple Events的一种方法.
因此,您只需要直接构建Apple Events并将其从Objective-C或其他任何语言发送到其他应用程序.
老实说,如果你只是想改变Adium的状态,最简单的方法就是使用NSAppleScript并传递你刚才写的东西,从Objective-C里面.
如果你想做更复杂的事情,可以选择Scripting Bridge.此机制将Apple Events的对象层次结构映射到Objective-C的对象层次结构.
如果您认为这仍然是新手的方式,您应该直接创建Apple Events NSAppleEventDescriptor.
好吧,我们中的一些老计时器认为使用Objective-C是一种娘娘腔的方式.如果你这么认为,你应该直接处理被调用的C结构AEDesc等.请参阅Apple Events编程指南和相应的参考.
但是,我认为使用OS X的人都是新手.真正的人使用Linux.
我父亲会说使用GUI的人太被宠坏了.
关键是,你不必关心它是否是新手的方式.重要的是你能否实现自己想要的目标.事实上,AppleScript是一种非常强大的动态语言,其功能并未得到很多人的认可.阅读AppleScript语言指南并感到惊讶.
最简单的方法是使用 NSAppleScript
NSAppleScript *script = [[NSAppleScript alloc]
initWithSource:@"tell application \"Adium\" to go away with message \"Zoned in for Maths.\""
];
Run Code Online (Sandbox Code Playgroud)
有关访问脚本的更强大方法,请使用Scripting Bridge.脚本桥至少需要10.5 SDK.您首先需要准备您的应用程序.
sdef和sdp命令行实用程序为要控制的应用程序生成头文件(有关详细信息,请参阅" 准备编码 ").之后,您可以使用Objective-C将脚本命令发送到应用程序.
AdiumApplication *adium = [SBApplication applicationWithBundleIdentifier:@"com.adiumX.adiumX"];
for (AdiumAccount* acct in [adium accounts]) {
[acct goAwayWithMessage:(AdiumRichText *)@"Zoned in for Maths."];
}
Run Code Online (Sandbox Code Playgroud)
状态消息是Adium的富文本类型(NSTextStorage在幕后),但它可以从纯文本转换,因此传递NSString而不是true AdiumRichText应该可以正常工作.
有几个箍可以跳过.例如,您无法直接使用其ObjC类在目标应用程序中创建脚本对象 ; 您必须使用classForScriptingClass:来获取类,然后你就可以用它来创建对象为正常(即alloc和init,initWithProperties&C).
// creating an AdiumContactGroup
NSDictionary *props = [NSDictionary
dictionaryWithObjectsAndKeys:
@"mathies",@"name",
nil
];
AdiumContactGroup *mathies= [[[[adium classForScriptingClass:@"contact group"] alloc]
initWithProperties:props]
autorelease];
if (mathies) {
[[adium contactGroups] addObject:mathies];
}
Run Code Online (Sandbox Code Playgroud)
请注意,其他语言(如Python和Ruby)也具有Scripting绑定.
| 归档时间: |
|
| 查看次数: |
914 次 |
| 最近记录: |