【问题标题】:iTunes AppObjC Swift Mirror StateiTunes AppObjC Swift 镜像状态
【发布时间】:2019-08-06 11:09:37
【问题描述】:

我有一个 AppleScript 到 Swift 的桥,我的 applescripts 通过 Swift AppDelegate 被调用。该项目是 iTunes 的控制器。按钮(例如播放/暂停、快进、倒带)可以工作,但我不确定如何让播放/暂停按钮根据 iTunes 的播放器状态更改状态(即,如果 iTunes 正在播放我的应用程序的播放/暂停按钮应该显示暂停符号)。这不仅应该在我单击应用程序中的按钮时发生变化,而且在我与 iTunes 交互时也会发生变化。

【问题讨论】:

  • 显示。您的。代码。
  • 我没有任何代码来响应 iTunes 的状态。那是我的问题!执行我的其他功能的代码(在 AppleScript 文件、桥接器和委托中)我认为没有帮助
  • 到目前为止你得到了什么?除了可以查询播放器状态的脚本字典属性之外,您还可以为 iTunes 分发通知注册一个观察者,以便在播放器状态或歌曲信息更改时收到通知。
  • 我可以通过简单的提示从 AppleScript 中获取播放器状态。但这个问题是如何让它不断更新 UI 而不必调用它,例如当我按下一个按钮。我希望按钮在 iTunes 中按下暂停后立即更改状态。如果播放器状态正在播放,则告诉应用程序“iTunes”然后返回“正在播放”,否则返回“未播放”结束如果结束告诉

标签: swift itunes bridge applescript-objc


【解决方案1】:

设置按钮的初始状态或其他任何东西,并为 iTunes 分发通知注册一个观察者:

let center = DistributedNotificationCenter.default()
center.addObserver(self,
                   selector:#selector(updatePlayerInfo),
                   name:NSNotification.Name("com.apple.iTunes.playerInfo"),
                   object:nil)

然后在通知的 userInfo 中使用适当的键进行更新:

@objc func updatePlayerInfo(_ notification: Notification) {
  print(notification.userInfo?["Player State"] as! String) // example
}

您还可以添加 NSWorkspace 观察者以在 iTunes 从您手下退出或其他情况时收到通知。

【讨论】:

  • 这对于播放暂停按钮非常有效,但是您如何跟踪不会导致通知的属性的更改,例如球员位置/时间?我在想我只是将当前时间设置为在每次更改歌曲时重置,并且每秒更改一次 UI,但是如果有人拖动图钉手动将歌曲恢复 5 秒,因为没有通知,这不会考虑在内从 iTunes 发出。
  • userInfo 字典中除了播放/暂停之外还有其他属性,但 iTunes 只提供它提供的通知。对于无需轮询 iTunes 的其他属性的实时更新,您的应用程序需要是正在播放文件的内容,例如通过 Media Player framework(macOS Sierra 及更高版本)。
猜你喜欢
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多