8

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

目前,我正在使用以下代码尝试将此信息插入nowPlayingInfo字典。我还包含了VideoInfovideoBeganPlaying(_:).

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()using MPRemoteCommandCenter

怎么了?

编辑:

正如马特指出的那样,AVPlayerViewControllerMPNowPlayingInfoCenter很时髦。这是我的问题。我应该指定这是我正在使用的类,而不仅仅是AVPlayer.

见: https ://developer.apple.com/reference/avkit/avplayerviewcontroller/1845194-updatesnowplayinginfocenter

4

4 回答 4

9

它确实有效,并且您不需要关于第一响应者的所有花言巧语等等,因为您可以通过继续设置正在播放的信息而不是其他任何东西来轻松地向自己证明:

在此处输入图像描述

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

于 2017-01-16T23:45:12.357 回答
4

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

playerViewController.updatesNowPlayingInfoCenter = false
于 2018-03-25T00:42:19.623 回答
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()
}
于 2021-06-24T16:30:57.380 回答
0

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

即使我没有使用 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]

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

于 2021-07-23T12:05:16.803 回答