MPNowPlayingInfoCenter在分配到nowPlayingInfo后不会更新任何信息

时间:2017-01-16 22:08:06

标签: ios swift swift3 mpnowplayinginfocenter

我正在使用Swift 3创建一个iOS应用程序,其中显示有关锁定屏幕和控制中心当前播放项目的信息会很不错。

目前,我使用以下代码尝试将此信息插入nowPlayingInfo词典。我还提到了对VideoInfo中使用的videoBeganPlaying(_:)类的引用。

class VideoInfo {
    var channelName: String
    var title: String
}

// ...

var videoInfoNowPlaying: VideoInfo?

// ...

@objc private func videoBeganPlaying(_ notification: NSNotification?) {
    // apparently these have to be here in order for this to work... but it doesn't
    UIApplication.shared.beginReceivingRemoteControlEvents()
    self.becomeFirstResponder()
    guard let info = self.videoInfoNowPlaying else { return }
    let artwork = MPMediaItemArtwork(boundsSize: .zero, requestHandler:
        { (_) -> UIImage in #imageLiteral(resourceName: "DefaultThumbnail") }) // this is filler
    MPNowPlayingInfoCenter.default().nowPlayingInfo = [
            MPMediaItemPropertyTitle: info.title,
            MPMediaItemPropertyArtist: info.channelName,
            MPMediaItemPropertyArtwork: artwork
        ]
    print("Current title: ", MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPMediaItemPropertyTitle])
}

该函数应该被调用,并且执行print语句,输出Optional("title")。但是,控制中心和锁定屏幕不会更新其信息。暂停/播放,以及向前跳过按钮的工作,我使用viewDidLoad()MPRemoteCommandCenter中设置它们。

出了什么问题?

修改

正如马特指出的,AVPlayerViewController使MPNowPlayingInfoCenter时髦。这是我的问题。我应该指定这是我正在使用的类,而不仅仅是AVPlayer

请参阅: https://developer.apple.com/reference/avkit/avplayerviewcontroller/1845194-updatesnowplayinginfocenter

4 个答案:

答案 0 :(得分:5)

它确实有效,并且您不需要关于第一响应者的所有关键等等,因为您可以通过直接设置现在正在播放的信息并且没有别的:

enter image description here

那为什么不适合你呢?可能是因为您正在使用某种类型的播放器(例如AVPlayerViewController)以某种方式设置正在播放的信息本身,从而覆盖您的设置。

答案 1 :(得分:1)

这让我措手不及。找到了关于此的有用帖子。 https://nowplayingapps.com/how-to-give-more-control-to-your-users-using-mpnowplayinginfocenter/

“为了在通知屏幕上显示 nowplayinginfo,您需要在 AppDelegate 的 didFinishLaunchingWithOptions 函数中添加最后一段代码。”

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     application.beginReceivingRemoteControlEvents()
}

答案 2 :(得分:0)

如果您使用的是AVPlayerViewController,则可以指定AVPlayerViewController实例未更新NowPlayingInfoCenter

playerViewController.updatesNowPlayingInfoCenter = false

答案 3 :(得分:0)

2021 年,我在使用 AVPlayerViewController 时仍然遇到此问题。我正在开发一个可以播放播客和视频的应用程序。现在播放信息中心与播客一起正常工作,但它不会显示使用 AVPlayerViewController 播放的视频的任何信息,即使我正确设置了 MPNowPlayingInfoCenter.nowPlayingInfo

找到了观看 Now Playing and Remote Commands on tvOS 的解决方案,即使我没有使用 tvOS。

基本上,我没有使用 MPNowPlayingInfoCenter 填充信息,而是在 externalMetadata 上设置了 AVPlayerItem 并且它有效。

let playerItem = AVPlayerItem(url: data.url)
let title = AVMutableMetadataItem()
title.identifier = .commonIdentifierTitle
title.value = "Title" as NSString
title.extendedLanguageTag = "und"

let artist = AVMutableMetadataItem()
artist.identifier = .commonIdentifierArtist
artist.value = "Artist" as NSString
artist.extendedLanguageTag = "und"

let artwork = AVMutableMetadataItem()
artwork.identifier = .commonIdentifierArtwork
artwork.value = imageData as NSData
artwork.dataType = kCMMetadataBaseDataType_JPEG as String
artwork.extendedLanguageTag = "und"

playerItem.externalMetadata = [title, artist, artwork]

此代码现在可以正确更新播放信息。