【问题标题】:iOS MPMusicPlayerController song changed notification does not have a song object with itiOS MPMusicPlayerController 歌曲更改通知没有歌曲对象
【发布时间】:2018-12-06 00:07:37
【问题描述】:

我正在开发一个应用程序来收听 MPMusicPlayerController 的歌曲变化。

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

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

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

我是不是做错了什么,还是必须采取一些特殊的技巧来检索实际的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 的音乐播放器。我没有从云端播放歌曲。

【问题讨论】:

  • 您将对象设置为nil,您需要将其设置为项目
  • 你好,@Tometoyou。感谢你的回复。请给个更详细的解释好吗?谢谢:D

标签: ios swift mpmusicplayercontroller


【解决方案1】:

您需要在通知中设置对象,才能获取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
}

【讨论】:

  • 感谢@Tometoyou 的进一步详细解释。我就是这样做的,但我使用的播放器是MPMusicPlayerController.systemMusicPlayer。方法返回的nowPlayingItem仍然是nil =/
  • 如果 nowPlayingItem 为 nil,但控制器存在,那么您可能没有玩项目?
  • 我是。与 Apple 的音乐播放器交互时,我总是在播放另一首歌曲
【解决方案2】:

我刚刚发现为什么nowPlayingItem 总是nil

用户必须似乎已允许该应用访问“媒体和 Apple Music”。如果未授予此访问权限,则应用将无权知道系统播放器上当前正在播放的内容。

可以按如下方式请求此授权:

// if not yet given or requested
MPMediaLibrary.requestAuthorization { authorizationStatus in }

// if already requested and denied (will take user to the App Settings Page)
UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多