Ios 当iPhone连接到配件时,是否有办法访问当前播放的曲目?

Ios 当iPhone连接到配件时,是否有办法访问当前播放的曲目?,ios,cocoa-touch,audio-player,Ios,Cocoa Touch,Audio Player,我正在尝试在iOS应用程序中接收有关当前播放曲目的信息。当iPhone没有连接到附件时,这项功能可以正常工作。如果我将其连接到我的汽车(欧宝阿斯特拉,iPhone插孔),以下代码将停止工作: 如果您创建iPod音乐播放器,并且用户使用家庭共享播放另一个库中的项目,则此属性的值为nil 代码: 我甚至尝试过“黑客”的东西,比如访问“私有”属性(): 或者调用私有方法: // Same behaviour like [iPod nowPlayingItem], works // only whil

我正在尝试在iOS应用程序中接收有关当前播放曲目的信息。当iPhone没有连接到附件时,这项功能可以正常工作。如果我将其连接到我的汽车(欧宝阿斯特拉,iPhone插孔),以下代码将停止工作:

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

代码:

我甚至尝试过“黑客”的东西,比如访问“私有”属性():

或者调用私有方法:

// 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];
它也没有解决方案可以随时访问新的
mpnowplayingfocenter
,它的
nil

[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo
我的汽车不使用iPhone应用程序直接播放音乐,而且我的iPhone似乎知道汽车当前在播放什么,因为它在锁屏上显示标题、艺术家和封面图标(并且仅在那里)。同时,内部播放次数也会增加

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

[[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying 

那么,有没有办法(可能是通过调用私有方法)访问歌曲,汽车正在播放?

您是否使用线程?如果是这样,在主线程上运行代码。如果没有,则注册MPMusicLayerController通知。这样,当歌曲更改时,您的应用程序将知道新歌是什么。另外,请确保它在服务器上运行

如果您的播放状态在连接时正在更新,但您的nowPlayingItem没有更新,这将确认它是一个bug。我将就此问题提交一份报告

编辑:
访问并滚动至底部。最后一个问题是,您可以联系TSI进行bug解决。作为一名免费开发人员,您会收到两个TSI请求,因此您可以使用其中一个请求来询问他们是否有使用私有库的方法,直到错误得到修复。

我非常确定答案是否定的,您至少不能使用任何公共api,但您应该向apple提交一个错误,原因有两个:

MPNowPlayingFoCenter没有提供信息的原因是,它必须由播放音乐的应用程序具体实现,如果苹果的应用程序正在播放音乐,那么它应该已经实现,所以请提交一个bug

现在,如果你说[[MPMusicLayerController IPodMusicLayer]playbackState]反映了播放的变化,那么这意味着IPodMusicLayer仍然是负责播放的应用程序,因此MPMediaItemPropertyTitle给你零也应该作为一个bug报告给苹果


此外,该主题的非公开信息可能包含在中,任何人都不会冒任何风险。

事实上,你不会得到任何MPMediaItem,因为你的iPhone没有播放歌曲,但你连接到iPhone的汽车配件正在访问媒体库。在此过程中,它负责更新所访问对象(歌曲)的所有元数据,特别是增加播放次数并更新歌曲的最后访问日期。它还在iTunes库中存储歌曲位置的一些信息

锁屏读取此信息以更新盖子。这也有助于iPod应用程序继续保留汽车附件

因此,点击图书馆,从那里获取最新信息。看看TopSongs示例项目,开始吧。

在我报告它是一个bug之后,苹果刚刚在iOS 6.1中“修复了它”。当我的iPhone连接到我的汽车时,以下代码现在起作用:

MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem];

NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];

NSLog(@"Playing title: %@", title);

而且,我真正喜欢的是:也可以使用iPod应用程序更改播放曲目-该应用程序的显示方式与您预期的一样,而不是白色的“连接到附件”大屏幕。因此,这也可能在程序上起作用。

OT:当我看到您将汽车视为手机的附件而不是相反时,我不得不微笑:-)您能解释一下您是通过耳机插孔还是iPhone插孔连接的吗?我还假设你的车正在播放iPhone上的音乐?如果iPhone正在播放歌曲,那么我假设iPhone实际上是在播放音乐而不是汽车。当你的应用程序连接到汽车时,你想通过它播放音乐,让它从汽车扬声器中出来吗?我通过iPhone插孔连接iPhone。我不知道是谁在实际播放音乐,但我可以从车上的信息显示屏中选择音乐。我只想知道在第三方应用程序中当前播放的歌曲是什么。(也可以使用第三方应用程序播放音乐,但汽车音频控制仅适用于真正的“音乐”应用程序)@Blauesocke besure使用
@person
,以便在您发表评论时通知我们。您能否确认您的汽车是否正在打开手机上的音乐应用程序?此外,如果您在未连接到汽车的情况下打开音乐应用程序,您的应用程序是否检测到音乐应用程序中正在播放的内容?据我所见,您的代码应该能够检测音乐播放的歌曲。app@Computer是的,当我将音乐应用程序连接到汽车时,它会显示“已连接到附件”。当汽车播放歌曲时,第三方应用程序在调用“[[MPMusicLayerController IPodMusicLayer]nowPlayingItem]”时会显示“无”,但当我拔下iPhone时,会显示汽车播放的最后一首曲目的信息。所以,这似乎只是一个(非越狱)软件限制。如何访问播放歌曲的信息?正如文档中所说,没有userInfo字典,所以我仍然需要使用[[MPMusicLayerController IPodMusicLayer]nowPlayingItem]什么是零?不,我不认为这很重要:-)@Blauesocke你越狱了吗?不,但是使用私有api调用(如果有匹配功能的调用)不会有问题@Blauesocke我之所以问这个问题,是因为一部被判入狱的手机可能会覆盖一些API。在我看来,这似乎是
nowPlayingItem
的一个bug,因为它只在iPhone插入时出现。作为一个
[[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying 
MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem];

NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];

NSLog(@"Playing title: %@", title);