Swift 正在使用ScriptingBridge读取macOS中当前播放的曲目不起作用

Swift 正在使用ScriptingBridge读取macOS中当前播放的曲目不起作用,swift,macos,scripting-bridge,Swift,Macos,Scripting Bridge,我正在尝试使用ScriptingBridge阅读iTunes当前播放的曲目。 我在这里找到了几个其他的线程,但似乎没有人为我工作(macOS Mojave和iTunes 12.9.4) 我使用以下命令创建了iTunes.h文件: sdef /Applications/iTunes.app | sdp -fh --basename "iTunes" 我正在创建脚本桥的一个实例,如下所示: if let itunes: AnyObject = SBApplication(bundleIdenti

我正在尝试使用ScriptingBridge阅读iTunes当前播放的曲目。 我在这里找到了几个其他的线程,但似乎没有人为我工作(macOS Mojave和iTunes 12.9.4)

我使用以下命令创建了iTunes.h文件:

sdef /Applications/iTunes.app | sdp -fh --basename "iTunes" 
我正在创建脚本桥的一个实例,如下所示:

if let itunes: AnyObject = SBApplication(bundleIdentifier: "com.apple.iTunes")
{
  if itunes.isRunning
  {
    Swift.print("iTunes is running...")
  }

  Swift.print(itunes.currentTrack?.name)
  Swift.print(itunes.currentTrack?.album)
}
代码编译得很好。当我运行代码时,我得到以下输出:

iTunes is running...
nil
nil
当前曲目为零,但iTunes正在播放一首歌曲。我错过了什么?我已经尝试禁用沙箱,但没有效果。我正在使用macOS Mojave、Xcode 10.2和iTunes 12.9.4。 还有,当iTunes没有运行时,它会启动吗?为什么?


有没有其他方法可以获取当前正在播放的iTunes歌曲?

关键是你必须在某个时候看到这样的对话框

MyApp希望访问控制“iTunes”。允许控制将提供对“iTunes”中文档和数据的访问,并在该应用中执行操作

如果您尚未看到该对话框:

  • 在权限中,关闭沙箱

  • 在Info.plist中,添加一个Privacy-AppleEvents Sending Usage Description条目,该条目的值为任意字符串

运行应用程序。如果仍然无法运行,请在终端中说:

tccutil reset AppleEvents

然后再次运行应用程序。

马特提供的解决方案有效

我注意到,如果我向授权文件添加以下键,沙箱功能仍然可以启用:

    <key>com.apple.security.temporary-exception.apple-events</key>
    <array>
       <string>com.apple.iTunes</string>
    </array>
com.apple.security.temporary-exception.apple-events
com.apple.iTunes

Stab in the dark,但似乎是一个范围问题。如果您将最后两行放在前面的
if
块中会怎么样?您是对的,当没有播放曲目时,这是正确的,但现在出于测试目的,我不需要移动代码-虽然正在播放歌曲,但它仍然打印“nil”。是否有
currentTrack()
property您可以访问以遍历当前播放的歌曲吗?是的,有…我正在使用它,请再看一看上面的代码。好吧,我不会这么认为。这是莫哈韦!事情锁定得更紧。测试这首歌的简单方法是:尝试在较低的系统上运行您的应用程序。如果它在那里工作,而不是在莫哈韦,我会莫哈韦挡住你的路了。