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

Tho*_*sen 22 cocoa-touch audio-player ios

我正在尝试接收有关iOS应用中当前播放曲目的信息.当iPhone 连接到配件时,这非常好用.如果我将它连接到我的汽车(欧宝Astra,iPhone插孔),以下代码将停止工作,如文档中所述:

如果您创建iPod音乐播放器并且用户使用Home Sharing播放来自其他库的项目,则此属性的值为nil.

码:

// nil while connected to an accessory
MPMediaItem *nowPlayingMediaItem =
                 [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem];

// Works while not connected to an accessory
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];
Run Code Online (Sandbox Code Playgroud)

我甚至试过"hacky"之类的东西,比如访问"私有"属性(原始代码):

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
Run Code Online (Sandbox Code Playgroud)

或者调用私有方法:

// 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];
Run Code Online (Sandbox Code Playgroud)

它也没有解决访问新的MPNowPlayingInfoCenter,它nil所有的时间.

[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo
Run Code Online (Sandbox Code Playgroud)

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

如果我检查播放状态,它还会返回YES汽车是否播放音乐:

[[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying 
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*sen 2

在我将其报告为错误后,Apple 刚刚在 iOS 6.1 中“修复了该问题”。当我的 iPhone 连接到我的汽车时,以下代码现在可以运行:

MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem];

NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];

NSLog(@"Playing title: %@", title);
Run Code Online (Sandbox Code Playgroud)

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