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

11

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

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

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])
}

该函数在应该被调用时被调用,打印语句输出“Optional("title")”。然而,控制中心和锁屏界面没有更新它们的信息。暂停/播放和快进按钮可以工作,因为我在viewDidLoad()中使用MPRemoteCommandCenter设置了它们。出了什么问题?
编辑:
正如马特所指出的那样,AVPlayerViewController使MPNowPlayingInfoCenter变得混乱。这就是我的问题所在。我应该指定这是我正在使用的类,而不仅仅是AVPlayer
参见:https://developer.apple.com/reference/avkit/avplayerviewcontroller/1845194-updatesnowplayinginfocenter
4个回答

11

它可以工作,而且你不需要所有关于第一响应者等的繁琐内容,只需设置现在播放信息和 仅此而已,就可以轻松证明给自己看:

输入图像描述

那么为什么它对你不起作用呢?可能是因为你正在使用某种播放器(如AVPlayerViewController),该播放器以某种方式 自行 设置现在播放信息,从而覆盖了你的设置。


你忽略了艺术作品的部分...我并没有完全理解问题中与此相关的代码,希望能从答案中学到一些东西 :) - Motti Shneor
嗨,@MottiShneor,很高兴收到你的来信!如果您有特定的问题,请将其作为单独的问题提出,好吗? - matt
对我来说,这只在模拟器上有效,而在实际设备上无效。在设备上,必须播放一些音乐才能更新控制中心 :( - Pavel Alexeev
@PavelAlexeev 如果您的应用程序没有播放音乐,则您的应用程序不是远程目标,因此您的应用程序不会更新远程接口。如果您从音乐应用程序播放音乐并切换到您的应用程序,则仍然是音乐应用程序是目标。 - matt
1
那么,如果我们使用AVPlayerViewController,如何更新标题呢?然而,默认情况下(一旦启用后台模式),控件会显示在锁定屏幕上并响应暂停/播放。我的唯一问题是我不确定如何覆盖AVPlayerViewController设置的默认nowPlayingInfo。 - cableload
显示剩余2条评论

5

如果您正在使用AVPlayerViewController,您可以指定AVPlayerViewController实例不更新NowPlayingInfoCenter

playerViewController.updatesNowPlayingInfoCenter = false

2
一旦我将其设置为“false”,锁屏控件甚至不会显示。我通过编程方式呈现AVPlayerViewController,不确定是否有任何区别。 - Dávid Pásztor
嘿,@DávidPásztor,你解决那个问题了吗? - matt
@DávidPásztor 我们认为,如果使用AVPlayerViewController,你根本无法完全掌控现在播放信息中心,对吗? - matt
@matt 是的,那是我得出的结论。 - Dávid Pásztor
@matt,@DávidPásztor,看起来我已经成功地使用AVPlayerViewController使其工作了。当你设置updatesNowPlayingInfoCenter = false时,在模拟器上信息中心不会出现,但似乎在实际设备上可以正常工作。你们是在物理设备上尝试过还是只在模拟器上? - Martin

4

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

通过观看tvOS上的现在播放和远程命令找到了解决方案,尽管我没有在使用tvOS。

基本上,我不是使用MPNowPlayingInfoCenter填充信息,而是在AVPlayerItem上设置externalMetadata,这样就可以工作了。

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]

这段代码正确地更新了正在播放的信息。

2
这让我有些困惑。但是我找到了一篇有用的文章来解决这个问题。需要在AppDelegate的didFinishLaunchingWithOptions函数中添加以下代码才能在通知屏幕上显示nowplayinginfo。具体内容请参考此链接:https://nowplayingapps.com/how-to-give-more-control-to-your-users-using-mpnowplayinginfocenter/
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     application.beginReceivingRemoteControlEvents()
}

我认为这与MediaPlayingInfo无关。 自iOS 4以来,它就可用,并且可以在AppDelegate方法中接收事件: remoteControlReceived(with:) 但是自iOS 7以来,您可以改用MediaPlayer框架(MPRemoteCommandCenter)。 - vmeyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接