代码之家  ›  专栏  ›  技术社区  ›  Augusto Carmo

iOS MPMusicLayerController歌曲更改通知中没有歌曲对象

  •  0
  • Augusto Carmo  · 技术社区  · 6 年前

    我正在开发一个应用程序,可以收听MPMusicLayerController的歌曲变化。

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

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

    nowPlayingItem 可在以下网址找到: (notification?.object as? MPMusicPlayerController)!.nowPlayingItem nil .

    我是否做错了什么,或者是否有一些特殊的技巧,必须做,以检索实际的数据 正在播放项目 ?

    下面是一个更完整的代码:

    // ...
    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` =/
    }
    // ...
    

    2 回复  |  直到 6 年前
        1
  •  0
  •   Tometoyou    6 年前

    nowPlayingItem .

    代码应该如下所示:

    private let playerController = MPMusicPlayerController.applicationMusicPlayer
    
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(systemSongDidChange(_:)),
        name: .MPMusicPlayerControllerNowPlayingItemDidChange,
        object: playerController
    )
    

    正在播放项目

    func systemSongDidChange(_ notification: Notification) {
        guard let playerController = notification?.object as? MPMusicPlayerController else {
            return
        }
        let item = playerController.nowPlayingItem
    }
    
        2
  •  0
  •   Augusto Carmo    6 年前

    我刚刚发现为什么会这样 nowPlayingItem 永远是 nil .

    看来用户 必须 已允许应用程序访问“媒体&苹果音乐”。如果未授予此访问权限,则应用程序将无权知道当前在系统播放器上播放的内容。

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

    // 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)!)
    
    推荐文章