objective-c - 新的 iTunes 11.0.3 和 ScriptingBridge 出现问题(特别是 'playerPosition' )

标签 objective-c macos cocoa itunes scripting-bridge

两三天前,Apple 推出了 iTunes 的新更新:新的迷你播放器、新的播放器时间栏等......我想:“太棒了!”。但我发现了一个新问题,这是我的问题:

很久以前,我通过在控制台应用程序中键入以下行来创建 iTunes.h 文件

sdef /Applications/iTunes.app | sdp -fh --basename "iTunes"

这是我一直使用 ScriptingBridge 从 iTunes 检索数据的文件。但现在,随着新的更新,调用 [iTunes playerPosition] 在最新版本中不再能正常工作(它仍然可以在旧版本中完美工作)。现在,我通过调用 playerPosition 获得的 NSInteger 始终为 3(秒,0:03),即使玩家位置不是这样。
所以我想,如果我再次生成 iTunes.h 文件,也许它会起作用。是的,我是对的!它工作得很好,但现在 [iTunes playerPosition] 在旧版本上已损坏,并且输出始终为 0(秒,0:00)。

有什么方法可以解决这个问题,以便它可以在旧版本和新版本上运行吗?
谢谢!

注意:如果您已更新 iTunes,请尝试下载 Significator for iTunes在 Mac App Store 上查看我在说什么。

最佳答案

根据两个.h中的信息文件时,您必须注意 iTunes 的版本,以便弄清楚如何解释返回的数据。特别是,您需要检查 info.plist 中的内部版本号。在 iTunes bundle 中,并基于此使用您使用 sdp 构建的两个类接口(interface)之一。我建议您取出旧文件并提取该类,并将其重命名为带有附加版本号的名称,因为您需要在根据您正在使用的 iTunes 版本调用该方法之前转换对象指针和。

所以,假设你有 ITunesObjectProxyITunesObjectProxy_old ,你会使用:

double progress;
if (newer)
    progress = [iTunes playerPosition ];
else
    progress = (double)[(ITunesProxyObject_old *)iTunes playerPosition ];

这样,您将确保正确处理 double 和 int。显然,您的对象和类的具体名称可能有所不同,我将确定 iTunes.app 版本的事情留给您,但这只是对 Info.plist 的简单检查。 .

关于objective-c - 新的 iTunes 11.0.3 和 ScriptingBridge 出现问题(特别是 'playerPosition' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16638973/

相关文章:

iphone - 帮助破译 iPhone 应用程序代码

java - 操作系统 : ant in Eclipse doesn't find mvn - but works in terminal

eclipse - 如何在MacOS上使用工作区路径名从命令行启动Eclipse

objective-c - 运行 NSUserUnixTask 时出现异常 `-[NSConcreteFileHandle readDataOfLength:]: Bad file descriptor`

objective-c - 在基于文档的应用程序中使用最前面窗口的控件?

objective-c - 当前目录路径和 NSTask

objective-c - 如何使用Mavericks API全屏显示您的应用

ios - 使用 Graph 在 Facebook 签到

c++ - 在 objective-c 项目 : c++ classes dont compile 中导入 iOS-QR-Code-Generator 文件

macos - 显示连接的显示器/显示器/分辨率的终端命令?