iPhone连接到附件时有没有办法访问当前播放的曲目?

我正尝试在iOS应用程序中接收有关当前播放曲目的信息。 当iPhone 没有连接到附件时,这工作得很好。 如果我将它连接到我的车(欧宝Astra,iPhone插孔),下面的代码停止工作,如文档中所述 :

如果您创build了iPod音乐播放器,并且用户使用“家庭共享”从另一个库中播放项目,则此属性的值nil

码:

 // nil while connected to an accessory MPMediaItem *nowPlayingMediaItem = [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]; // Works while not connected to an accessory NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle]; 

我什至试图“哈克”的东西喜欢访问“私人”属性( 原代码 ):

 MPMediaQuery *query=nil; MPMediaItemCollection *collection=nil; id internalPlayer=nil; Ivar internalPlayeriVar = object_getInstanceVariable(iPod, "_internal", NULL); internalPlayer = object_getIvar(iPod, internalPlayeriVar); NSLog(@"internalPlayer: %@", internalPlayer); Ivar queryIvar = object_getInstanceVariable(internalPlayer, "_query", NULL); query = object_getIvar(internalPlayer, queryIvar); // nil everytime Ivar collectionIvar = object_getInstanceVariable(internalPlayer, "_itemCollection", NULL); collection = object_getIvar(internalPlayer, collectionIvar); // nil everytime 

或者调用私有方法:

 // Same behaviour like [iPod nowPlayingItem], works // only while no accessory is connected MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItemAtIndex:[iPod indexOfNowPlayingItem]]; // Works while not connected to an accessory NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle]; 

它也无法一直访问新的MPNowPlayingInfoCenter

 [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo 

我的车直接播放我的音乐,而不使用iPhone应用程序看起来我的iPhone知道汽车当前正在播放什么,因为它在锁屏(仅在那里)显示标题,艺术家和封面图标。 内部玩法也增加了。

如果我检查播放状态,如果汽车播放音乐,则返回YES

 [[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying 

那么,有没有什么办法(可能是通过调用私人方法)来访问歌曲,车子目前是在玩吗?

你使用线程? 如果是这样的话,在主线程上运行代码。 如果不是,则注册MPMusicPlayerController通知以更改项目 。 这样,当歌曲改变你的应用程序将知道新歌是什么。 另外可以确定这也在主线程上运行。

如果您的播放状态在连接时正在更新,但您的nowPlayingItem不是,则会确认这是一个错误。 我会提交这个问题的错误报告 。

编辑:访问https://developer.apple.com/support/resources/bug-reporting.html并滚动到底部。 最后一个问题说你可以联系TSI寻找bug。 您可以获得2个TSI免费开发者的请求,所以您可以使用其中一个来询问他们是否有解决使用私有库的问题,直到问题得到解决。

在我报告这是一个错误之后,苹果在iOS 6.1中“修正了这个问题”。 下面的代码现在工作,而我的iPhone连接到我的车:

 MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem]; NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle]; NSLog(@"Playing title: %@", title); 

而且,我真的很喜欢:也可以使用iPod应用程序更改播放曲目 – 应用程序显示为您所期望的,而不是大白色“连接到附件”屏幕。 所以这也可能以编程方式工作。

我很确定答案是否定的,至less你不能使用任何公共api,但是你应该向苹果提交一个bug,原因有二:

MPNowPlayingInfoCenter不给你的信息的原因是因为它必须由播放音乐的应用程序具体实现,如果苹果的应用程序播放,那么它应该已经实现,因此,文件的错误。

现在如果你说[[MPMusicPlayerController iPodMusicPlayer] playbackState]反映播放的变化,那么这意味着iPodMusicPlayer仍然是负责播放的应用程序,所以给你零MPMediaItemPropertyTitle也应该报告给苹果作为一个错误。

此外,关于这个主题的非公开信息可能涵盖了MFi NDA ,没有人会冒着屁股的风险。

其实你不会得到任何MPMediaItem,因为你的iPhone不是在播放歌曲,而是连接到iPhone的汽车附件正在访问媒体库。 在此过程中,它负责更新所访问对象(歌曲)的所有元数据,特别是递增播放计数并更新歌曲的最后访问date。 它还会在iTunes资料库中存储歌曲所在位置(位置)的某些信息。

该信息由locking屏幕读取以更新封面。 这也是帮助iPod应用程序继续您的汽车配件离开的地方。

因此,进入图书馆,并从那里获取最新的信息。 看看TopSongs示例项目开始。