关于Objective C:发布新的iTunes 11.0.3和ScriptingBridge(特别是” playerPosition”)

Issue with the new iTunes 11.0.3 and ScriptingBridge (specifically the 'playerPosition')

两三天前,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已更新,请尝试在Mac App Store上下载iTunes的Significator,以查看我在说什么。


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

因此,假设您有ITunesObjectProxyITunesObjectProxy_old,则应使用:

1
2
3
4
5
double progress;
if (newer)
    progress = [iTunes playerPosition ];
else
    progress = (double)[(ITunesProxyObject_old *)iTunes playerPosition ];

这样,您将确保正确处理double和int。显然,您的对象和类的特定名称可能有所不同,我将确定iTunes.app的版本留给您,但这是对info.plist

的简单检查。