我正在尝试接收有关iOS应用中当前播放曲目的信息。当iPhone 不连接到配件时,这非常好用。如果我将它连接到我的汽车(欧宝雅特,iPhone插孔),以下代码将停止工作as described in the documentation:
如果您创建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];
我甚至试过“hacky”之类的东西,比如访问“私有”属性(original code):
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];
它也是 no 解决方案,可以随时访问新的MPNowPlayingInfoCenter
,nil
。
[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo
我的车直接播放我的音乐而不使用iPhone应用程序和似乎我的iPhone知道汽车当前正在播放什么,因为它在锁定屏幕上显示标题,艺术家和封面图标(仅限那里)。内部播放次数也会增加。
如果我检查播放状态,如果汽车播放音乐,它还会返回YES
:
[[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying
那么,有没有办法(可能是通过调用私人方法)来访问该歌曲,该车目前正在播放?
答案 0 :(得分:2)
你在使用线程吗?如果是这样的话,在主线程上运行代码。如果没有,则注册item change的MPMusicPlayerController通知。这样,当歌曲改变你的应用程序将知道新歌是什么。另外请确保它在main thread as well上运行。
如果您的播放状态在连接时正在更新,但您的nowPlayingItem不是,则会确认这是一个错误。我会为此问题提交bug report。
编辑: 访问https://developer.apple.com/support/resources/bug-reporting.html并滚动到底部。最后一个问题是你可以联系TSI进行bug工作。您可以免费获得2个TSI请求作为开发人员,因此您可以使用其中一个来询问他们是否有使用私有库的工作,直到修复错误。
答案 1 :(得分:2)
MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem];
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];
NSLog(@"Playing title: %@", title);
而且,我真正喜欢的是:也可以使用iPod应用程序更改播放曲目 - 应用程序按预期显示,而不是大白色“连接到配件”屏幕。所以这也可能以编程方式工作。
答案 2 :(得分:0)
我很确定答案是否定的,至少你不能使用任何公共API,但你应该提交苹果错误有两个原因:
MPNowPlayingInfoCenter没有提供信息的原因是因为它必须由播放音乐的应用程序专门实现,如果苹果的应用程序正在播放,那么它应该已经实现,因此提交了一个错误。
现在,如果你说[[MPMusicPlayerController iPodMusicPlayer] playbackState]反映了播放的变化,那么这意味着iPodMusicPlayer仍然是负责播放的应用程序,所以MPZiaItemPropertyTitle也应该向你报告为错误。
此外,MFi NDA可能会涵盖有关该主题的非公开信息,并且没有人会冒他的风险。
答案 3 :(得分:0)
实际上你不会得到任何MPMediaItem,因为你的iPhone没有播放歌曲,但连接到iPhone的汽车配件正在访问媒体库。在这样做时,它负责更新所访问的对象(歌曲)的所有元数据,尤其是递增播放计数并更新歌曲的最后访问日期。它还存储一些关于歌曲在iTunes库中的位置(位置)的信息。
锁定屏幕会读取此信息以更新封面。这也是帮助iPod应用程序在汽车配件离开的地方继续运行的原因。
然后点击图书馆并从那里获取最新信息。看看TopSongs示例项目即可开始。