如何更改 AVRoutePickerView 的元数据?

Posted

技术标签:

【中文标题】如何更改 AVRoutePickerView 的元数据?【英文标题】:How to change metadata for AVRoutePickerView? 【发布时间】:2018-10-07 15:17:01 【问题描述】:

我的应用播放一些声音,我实现了 AVRoutePickerView,以便它可以通过 AirPlay 或蓝牙流式传输其声音。

点击 AVRoutePickerView 后,会弹出上面的图片,这很好,但是图片和标题错误。

图片和标题来自我之前玩过的 Apple Music 应用。

如何更改此元数据?

我尝试过配置 MPNowPlayingInfoCenter,但没有成功。

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]

这就是我制作 AVRoutePickerView 的方式。

import AVKit

let routePickerView = AVRoutePickerView.init(frame: myFrame)
routePickerView.backgroundColor = UIColor.clear
routePickerView.tintColor = UIColor(named: someColor)
routePickerView.activeTintColor = UIColor(named: someColor)
soundController.contentView.addSubview(routePickerView)

我的应用面向 ios11 并在 iPhone 6 和 iPhone 7 上进行测试。

请引导我正确的方式。 谢谢

【问题讨论】:

【参考方案1】:

>> 更新 除了使用 MPNowPlayingInfoCenter 对象提供“正在播放”信息之外,您似乎还需要使用 MPRemoteCommandCenter 对象设置远程事件处理程序(即使未使用)。 此外,在应用播放音频之前,“正在播放”信息似乎不会更新。

步骤:

1.设置远程控制事件处理程序。 在这个例子中,我只配置了 pauseCommand,因为这就是让 Now Playing 信息工作所需的全部内容。

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.使用 MPNowPlayingInfoCenter 对象配置正在播放信息。

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.创建 Route Picker 视图控件。

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

【讨论】:

我在调度队列中实现了您的代码,但没有运气。无论如何,谢谢。 你是如何实现 AVRoutePickerView 的?有代码示例吗? 像魅力一样工作!我应该设置远程控制事件处理程序。非常感谢! 我正在使用 AVRoutePickerView 进行音频呼叫路由,但 AVRoutePickerView 在按下按钮时显示 iTunes 图标而不是我的应用程序的图标。虽然它在一个单独的 POC 中工作,我只是将 AVRoutePickerView 的实例添加为子视图

以上是关于如何更改 AVRoutePickerView 的元数据?的主要内容,如果未能解决你的问题,请参考以下文章

具有复制属性的类方法的元数据在更改源类的元数据时发生更改 - Typescript

如何更新 AngularJS 中的元标记?

tuple 可更改的列表和不可更改的元组

字典中的元组

如何在 django 模板的 forloop 中访问 If 语句中的元组值?

AirPlay:连接到 Apple TV 时音量控制被禁用