【问题标题】:Interact with iTunes on a OS X application在 OS X 应用程序上与 iTunes 交互
【发布时间】:2015-01-12 18:58:22
【问题描述】:

我完全不知道从哪里开始。我想在 Objective-C 中构建一个与 iTunes 交互的 OS X 应用程序,即添加歌曲、电影、按播放或暂停等。

现在,我知道在 Windows 中,我可以使用 COM 来做到这一点,我已经尝试过了。 OS X 中有类似的东西吗?应用程序之间通常如何通信或它们如何公开其 API?

我应该阅读什么协议?

【问题讨论】:

  • AppleScript 在这里应该有所帮助
  • liquidx.net/eyetunes 是我与 iTunes 建立良好关系的选择 - 它直接通过 AppleEvents 完成所有事情。它可能有点过时了,但我敢打赌你找不到更快的东西!
  • @Zero:有趣的链接。 EyeTunes 似乎早于 Scripting Bridge 框架,它本质上做同样的事情(将 Apple Event IPC 包装在类似 OOP 的界面中)。对于新项目,我建议改为使用 Scripting Bridge;它几乎肯定会一样快,并且对于某些用途可能更快,并且它可以让您访问完整的当前 iTunes 脚本字典。

标签: objective-c


【解决方案1】:

您在 OS X 上寻找的是脚本或“自动化”以及 AppleScript。这是一个简短的故事,里面有一些链接可以帮助你前进:

主要应用程序(当然还有 iTunes,我在这方面有一些经验)公开了对象、方法和属性等的“脚本字典”,可以通过系统脚本框架访问。

这通常由 AppleScript 环境中的脚本完成。 AppleScript 是一种语言,它针对 OS X 上的这种底层脚本基础设施。你可以wade into that here。还有其他方法可以与脚本基础设施对话,但您应该事先了解 AppleScript 语言,无论好坏,实际上是唯一的“一流”方式,因此应用程序如何响应的语义往往与 AppleScript 与他们的对话方式密不可分。 (更多下文)

查看“脚本编辑器”应用程序(已经安装在您的 Mac 上,只需使用 Spotlight 打开它),它是标准的(尽管是极简的)用户级编辑器,并尝试使用其 File->Open Dictionary 命令来检查某些应用程序的字典(如 iTunes)。

如果您想从您的应用程序而不是您自己的一次性脚本与 iTunes 通信,您有几个选项(这些选项很容易混淆,但实际上相当独立):

  1. ObjC Scripting Bridge。这是一种通过使其看起来像一组原生 ObjC 对象来与应用程序对话的方式。一旦您了解了它的怪癖(概念映射不准确),我自己发现这是以复杂方式与 iTunes 交互的最方便的方式,但这里的意见会有所不同。
  2. AppleScriptObjC 是一种技术,可让您直接在 AppleScript 中实际编写 Cocoa 应用程序的整个部分(类)。我认为这对于想要将其功能封装在一流 Mac 应用程序中的熟练 AppleScript 程序员更有用,而不是您所描述的那样。
  3. 您可以使用NSAppleScript 类从Cocoa 中执行AppleScript 块。如果您想用 iTunes 做的事情具有相当有限的表面积并且使用 AppleScript 更好或更容易表达,则很有用。

我不知道您认为 iTunes 交互的复杂性是什么,但在您开始使用时需要了解以下一些重要事项:

  • 如果您已经是一位经验丰富的程序员,AppleScript 可能是一门可以掌握的语言。它具有一些令人惊讶的表达能力,但它陈旧、粗糙并且是为非程序员设计的(因此对于期望清晰语法和熟悉语义的程序员来说会感到困惑)。它的记录很差,周围的社区相当有限。它继续蹒跚前行,但要注意 Apple 并没有给它太多的爱。
  • 如果您想做一些重要的事情,即使是从 Scripting Bridge 开始,请先学习 AppleScript。如果您不了解它们如何映射到 AppleScript,语义将是相同的,并且从 Scripting Bridge 方面来说意义不大。同样,AppleScript 仍然是通过其脚本接口与应用程序对话的唯一一流方式。我发现 Late Night 的 Script Debugger 产品对于在学习时通过 AppleScript 进行跟踪非常宝贵。
  • 学习时的重要提示:AppleScript(尤其是 Scripting Bridge)提供了一个面向对象的应用程序视图:对象、方法、属性。但这是一个方便而诱人的小说;它是一种位于实际 IPC 机制之上的抽象,称为 Apple 事件。特别是如果你来自 COM 之类的东西,你越快理解脚本实际上是一个事件+查询系统(而不是 OOP 接口)的方式,你就会越快弄清楚如何有效地绕过它。
  • 应用程序对脚本的支持不一致、不完整、文档记录不完善且存在错误。我可以在 iTunes 中保证这一点,这可能比大多数都好。准备好应对各种令人惊讶的 iTunes 行为。遇到问题时,请随时提出有关 SO 的问题;这里潜伏着一些知识渊博的人。

【讨论】:

  • 感谢您的完整回答!基本上,这将是一个 Cocoa 应用程序,所以我可能会使用 Scripting Bridge 或 NSAppleScript !不相关,但是,您知道 Apple 是否计划更新或放弃 AppleScript 以获得更强大的功能?
  • @CoachNono。别客气。我刚刚完成了一个复杂的 iTunes 集成,所以这一切都在我脑海中浮现。 Yosemite 刚刚介绍了“Javascript for Automation”,它基本上是脚本框架的 JS 绑定。这看起来很有希望,但它的文档记录很差,尤其是与 iTunes 直接断了(别打扰,它会伤到你的心)。我不知道是否有任何更长的期限计划,但我希望如此!当它起作用时,这是一个强大的想法。祝你好运!
【解决方案2】:

目前,COM 的内置 Mac OS X 等效项是 Apple 事件。实现它们的最简单方法是使用 AppleScript,但您不必这样做;您可以直接形成原始 Apple 事件。

碰巧您选择了一个非常可使用 Apple 事件/AppleScript 进行通信的应用程序 (iTunes)。

【讨论】:

    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多