AppleScript很酷.我可以在普通的Objective-C中做同样的事情吗?

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语言指南并感到惊讶.

  • AppleScript实际上是一种非常非常强大的语言.只是大多数人都没有注意到.阅读http://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html. (3认同)
  • AppleScript编译为字节代码.你知道AppleScript Editor如何进行语法着色吗?它首先编译它,然后它反编译生成的字节代码,然后语法着色是微不足道的.在任何情况下,当您驾驶其他应用程序时,大多数时间都是由进程间通信的重型机器花费的.我不认为编程语言的选择在这里很重要. (3认同)
  • 另外,不要激动ObjC是一种编译语言......这表明你是多么年轻.方法在Objective-C中在运行时调度,与C++相反,C++主要在编译时确定.所以Objective-C被认为是一种缓慢的,类似脚本的语言! (2认同)

out*_*tis 6

最简单的方法是使用 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.您首先需要准备您的应用程序.

  1. 使用sdefsdp命令行实用程序为要控制的应用程序生成头文件(有关详细信息,请参阅" 准备编码 ").
  2. 将生成的标头添加到项目中.
  3. 将ScriptingBridge框架添加到项目中.之后,您可以使用Objective-C调用来控制其他应用程序.

之后,您可以使用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:来获取类,然后你就可以用它来创建对象为正常(即allocinit,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绑定.