>>更新(<)<
除了使用MPNowPlayingInfoCenter对象提供正在播放的信息外,似乎还需要使用MPRemoteCommandCenter对象设置远程事件处理程序(即使未使用)。
此外,在应用程序播放音频之前,当前播放的信息似乎不会更新。
步骤:
1、设置远程控制事件处理程序。
在本例中,我只配置了pauseCommand,因为这是使当前播放信息正常工作所需的全部内容。
func setupRemoteTransportControls() {
// Get the shared MPRemoteCommandCenter
let commandCenter = MPRemoteCommandCenter.shared()
// Add handler for Pause Command
commandCenter.pauseCommand.addTarget{ event in
// Does nothing yet
return .success
}
}
2、使用MPNowPlayingFocenter对象配置当前播放信息。
func setupNowPlayingInfo() {
var nowPlayingInfo = [String : Any]()
nowPlayingInfo[MPMediaItemPropertyTitle] = "My Song Title"
if let image = UIImage(named: "MyImage") {
nowPlayingInfo[MPMediaItemPropertyArtwork] =
MPMediaItemArtwork(boundsSize: image.size) { size in return image }
}
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}
3、创建路由选择器视图控件。
let routePickerView = AVRoutePickerView(frame: routView.bounds)
routePickerView.backgroundColor = UIColor.clear
routView.addSubview(routePickerView)
4、播放音频并查看路由选择器。
如果在播放应用程序音频之前查看路由选择器,则旧的“正在播放”信息将保留。
希望现在可以了!
旧答案
您的实现看起来不错。唯一的查询是boundSize。它应该是艺术品的原始尺寸。
手册中写道:“请求处理程序以新请求的大小返回图像。请求的大小必须小于boundsSize参数。”
似乎大多数实现只返回原始大小。
问题可能出在您的AVRoutePickerView实现上。
你能试着把它放在调度队列中吗?
DispatchQueue.main.async {
let albumArt = MPMediaItemArtwork(boundsSize:CGSize(width: 50, height: 50))
{ sz in return UIImage(named: "MyImage")!}
MPNowPlayingInfoCenter.default().nowPlayingInfo =
[MPMediaItemPropertyTitle: "some title",
MPMediaItemPropertyArtist: "some artist",
MPMediaItemPropertyArtwork: albumArt]
}
在我的音频流应用程序中,当应用程序位于后台时,我提供元数据以在控制中心和iOS锁屏中显示。
我使用MPVolumeView,它有一个按钮用于选择音频输出路径(自动处理AVRoutePickerView的实例化和显示)。
我的实施如下(按照手册):
var nowPlayingInfo = [String : Any]()
nowPlayingInfo[MPMediaItemPropertyTitle] = "Song Title"
nowPlayingInfo[MPMediaItemPropertyArtist] = "Song Artist"
if let image = UIImage(named: "SongImage") {
nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size) { size in return image }
}
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo