我已经完成了所有三个操作,但使用 Objective C 作为调用语言,而不是 ruby。
AppleScript。您可以使用 osascript 从 ruby 编写和调用 AppleScript。 AppleScript 在使用 AppleScript Editor 进行交互式开发方面有很好的支持。这很好用。但是...通过osascript 打电话很麻烦,而且每次与iTunes 通话时都会调用一个额外的过程。您还必须解析 osascript 的输出——这没什么大不了的,但肯定会让您远离真正想做的事情。
脚本桥。剩下的就是 Scripting Bridge 和 appscript。 Scripting Bridge 的好处是成为 Apple 支持的官方代码。 Scripting Bridge 有它的缺点,但它确实有效,而且工具支持很好。但是,我不知道您如何将它与 ruby 集成——其他人可能想在那里发表评论。
应用脚本。 Appscript 具有良好的文档和强大的代表作为出色的桥接解决方案。 Matt Neuberg 已将 appscript 移至 github (https://github.com/mattneub/appscript),其明确目标是使用该项目的 ruby 部分。另一个分支 (https://github.com/abarnert/appscript/network) 添加了进一步的修复,这就是我要开始的地方。我本人 (https://github.com/poulsbo/appscript) 已经更新了 Objective-C(大约是 Xcode 6 beta 5),但我还没有接触到 ruby 方面。
Scripting Bridge 与 appscript。从用户的角度来看,我注意到 appscript 和 Scripting Bridge 之间的一个区别是 appscript 更明确(好)但也更冗长(不好)。这是获取对象的name 属性的示例(伪Obj C);你明确地做了一个get 和send:
id result = [[[appscriptObject name] get] send];
而在 Scripting Bridge 中存在隐式惰性求值,因此看起来更像:
id result = [sbObject name];
在生成的标头中,类型信息也有不同的处理方式。我相信 Scripting Bridge 保留了更好的类型信息。
Appscript 在错误处理方面似乎更好,例如告诉你什么时候不可用。使用 Scripting Bridge,您似乎无论如何都得到了一个对象,并且在使用它时,您必须事后查询它以查看 lastError 是什么。我觉得这种编码模式很丑。
向后看? 话虽如此,正如您所指出的,问题在于 appscript 可能最好被视为“向后技术”。如果您采用它,您正在考虑自己支持/修复 appscript 中的任何问题,或者依赖其他人的修复。尽管它今天似乎运行良好(OS X 10.9),但在未来你可以预期它会损坏或需要进一步维护以保持运行。另一方面,由于您有源代码,您可以自行解决问题。 Scripting Bridge 中的错误将无法控制。
如果您想扭转局面并向前看,您可能想看看 Apple 为 Yosemite 做了什么,将 JavaScript 作为新的 OSA 语言。但是,这偏离了您最初的问题,即关于 ruby 和 iTunes。
底线。这里有各种权衡。
AppleScript。安全起见。
脚本桥。一个不错的中间地带?但不确定如何从 ruby 使用。
应用脚本。适合业余爱好者/DIY 人士。
JavaScript。对于早期采用者。