iOS MPMusicPlayerController 歌曲更改通知没有歌曲对象

标签 ios swift mpmusicplayercontroller

我正在开发一个应用程序,用于监听 MPMusicPlayerController 的歌曲变化。

为此,我添加以下观察者:

NotificationCenter.default
    .addObserver(self,
                 selector: #selector(systemSongDidChange(_:)),
                 name: .MPMusicPlayerControllerNowPlayingItemDidChange,
                 object: nil)

问题是,当通知被触发时,可以在 (notification?.object as? MPMusicPlayerController)!.nowPlayingItem 处找到的 nowPlayingItem 始终为

我是否做错了什么,或者是否必须采取一些特殊技巧来检索实际的 nowPlayingItem

这是更完整的代码:

// ...
init() {
    let systemPlayer = MPMusicPlayerController.systemMusicPlayer

    NotificationCenter.default.addObserver(self,
                                           selector: #selector(systemSongDidChange(_:)),
                                           name: .MPMusicPlayerControllerNowPlayingItemDidChange,
                                           object: systemPlayer)

    player.beginGeneratingPlaybackNotifications()
}

private func systemSongDidChange(notification: Notification) {
    let currentSong = (notification.object as? MPMusicPlayerController)?.nowPlayingItem
    // `currentSong` is always `nil` =/
}
// ...
<小时/>

我使用的播放器是Apple 的音乐播放器。我没有播放来自云端的歌曲。

最佳答案

您需要在通知中设置该对象,才能获取 nowPlayingItem

代码应如下所示:

private let playerController = MPMusicPlayerController.applicationMusicPlayer

NotificationCenter.default.addObserver(
    self,
    selector: #selector(systemSongDidChange(_:)),
    name: .MPMusicPlayerControllerNowPlayingItemDidChange,
    object: playerController
)

然后您应该能够在 systemSongDidChange 函数中像这样访问 nowPlayingItem:

func systemSongDidChange(_ notification: Notification) {
    guard let playerController = notification?.object as? MPMusicPlayerController else {
        return
    }
    let item = playerController.nowPlayingItem
}

关于iOS MPMusicPlayerController 歌曲更改通知没有歌曲对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53635537/

相关文章:

ios - 如何在 Xamarin.iOS 中保护 cache.db 文件

iOS:何时调用 cellForRowAtIndexPath?还是标签会更新?

c++ - Body 对象在 Box2d 中直线抛出

arrays - swift - corebluetooth 写入 2 个字节

swift - 如果一个代码点序列构成一个 Unicode 字符,那么该序列的每个非空前缀是否也构成一个有效字符?

android - Lua Service2Media 移动端

swift - 我想在我的开关盒中运行这两个功能,但只运行一个;我该如何解决?

ios - 如何从 WKWebView 获取当前在我的应用程序中播放的音频 URL?

iphone - 使用UISlider更改音量时如何隐藏Iphone音量框?

iOS 9 : How to change volume programmatically without showing system sound bar popup?