我正在尝试编写一个iOS应用程序,该应用程序将播放我的iPhone音乐库内容,显示艺术品和"宣布"标题,艺术家等。
我使用Apple的媒体播放器框架可以很好地工作。我可以在选定的播放列表中显示播放列表,并在选定的播放列表中排队。我使用" mpmusicplayercontrollernowplayingitemdidchange"观察者通知来暂停播放,检索元数据,并通过Avspeechsynthesizer进行公告。我是一个快乐的露营者,直到我遇到可怕的"媒体播放器框架没有回应后台的观察者通知"。
所以,我开始查看Avoundation框架。我找到了一个示例,该示例在后台通过URL播放本地歌曲文件。我试图通过Avfoundation检索音乐库内容的惨败。我也未能通过媒体播放器框架为AvFoundation播放器提供检索到的内容。(注意:从mpMediaItem检索的URL为伪造的" ipod-library://item/item.m4a?id = ################################# "格式。使用此" URL"创建AvplayerItem不起作用。)
有人成功实现了这一目标吗?我正在开发自己的用法。我无意在Apple的App Store中发布该应用程序,因此我愿意使用隐藏的API或未经应用批准的方法。
一个快速的代码示例将很棒。(Objective-C不是很多)
从用户库中获取了mpMediaItem,获取其assetURL
。从生成的URL创建Avplayer确实可以。
我的一个示例应用程序中的实际代码:
func oneSong () -> (URL?, String?) {
let query = MPMediaQuery.songs()
// always need to filter out songs that aren't present
let isPresent = MPMediaPropertyPredicate(value:false,
forProperty:MPMediaItemPropertyIsCloudItem,
comparisonType:.equalTo)
query.addFilterPredicate(isPresent)
let item = query.items?[0]
return (item?.assetURL, item?.title)
}
@IBAction func doPlayOneSongAVPlayer (_ sender: Any) {
let (url, title) = self.oneSong()
if let url = url, let title = title {
self.avplayer = AVPlayer(url:url)
self.avplayer.play()
MPNowPlayingInfoCenter.default().nowPlayingInfo = [
MPMediaItemPropertyTitle : title
]
}
}