分配给 nowPlayingInfo 后,MPNowPlayingInfoCenter 不更新任何信息
MPNowPlayingInfoCenter doesn't update any information when after assigning to nowPlayingInfo
我正在使用 Swift 3 制作一个 iOS 应用程序,其中在锁定屏幕和控制中心上显示有关当前播放项目的信息会很好。
目前,我正在使用以下代码尝试将此信息插入 nowPlayingInfo
字典。我还包括对 videoBeganPlaying(_:)
.
中使用的 VideoInfo
class 的引用
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")
。但是,控制中心和锁屏不会更新它们的信息。 Pause/play,向前跳按钮起作用,因为我使用 MPRemoteCommandCenter
.
在 viewDidLoad()
中设置了它们
怎么了?
编辑:
正如马特指出的那样,AVPlayerViewController
使 MPNowPlayingInfoCenter
变得时髦。这是我的问题。我应该指定这是我正在使用的 class,而不仅仅是 AVPlayer
.
它确实有效,你不需要关于第一响应者的所有内容等等,因为你可以通过继续并设置正在播放的信息和 nothing 来轻松地向自己证明否则:
那为什么它不适合你呢?可能是因为您正在使用某种播放器(例如 AVPlayerViewController)以某种方式设置正在播放的信息本身,从而覆盖您的设置。
如果您正在使用 AVPlayerViewController
,您可以指定 AVPlayerViewController
实例不更新 NowPlayingInfoCenter
:
playerViewController.updatesNowPlayingInfoCenter = false
这让我很吃惊。找到了关于此的有用 post。 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,我在使用 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]
此代码正确更新正在播放的信息。
我正在使用 Swift 3 制作一个 iOS 应用程序,其中在锁定屏幕和控制中心上显示有关当前播放项目的信息会很好。
目前,我正在使用以下代码尝试将此信息插入 nowPlayingInfo
字典。我还包括对 videoBeganPlaying(_:)
.
VideoInfo
class 的引用
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")
。但是,控制中心和锁屏不会更新它们的信息。 Pause/play,向前跳按钮起作用,因为我使用 MPRemoteCommandCenter
.
viewDidLoad()
中设置了它们
怎么了?
编辑:
正如马特指出的那样,AVPlayerViewController
使 MPNowPlayingInfoCenter
变得时髦。这是我的问题。我应该指定这是我正在使用的 class,而不仅仅是 AVPlayer
.
它确实有效,你不需要关于第一响应者的所有内容等等,因为你可以通过继续并设置正在播放的信息和 nothing 来轻松地向自己证明否则:
那为什么它不适合你呢?可能是因为您正在使用某种播放器(例如 AVPlayerViewController)以某种方式设置正在播放的信息本身,从而覆盖您的设置。
如果您正在使用 AVPlayerViewController
,您可以指定 AVPlayerViewController
实例不更新 NowPlayingInfoCenter
:
playerViewController.updatesNowPlayingInfoCenter = false
这让我很吃惊。找到了关于此的有用 post。 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,我在使用 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]
此代码正确更新正在播放的信息。