iOS MPMusicPlayerController уведомление об изменении песни не имеет объекта песни с ним - PullRequest
0 голосов
/ 05 декабря 2018

Я занимаюсь разработкой приложения, которое прослушивает изменения песен MPMusicPlayerController.

Для этого я добавляю следующего наблюдателя:

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

Проблема заключается в том, что при уведомленииnowPlayingItem, который можно найти в (notification?.object as? MPMusicPlayerController)!.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.Я не играю песни из облака.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Я только что выяснил, почему nowPlayingItem всегда nil.

Кажется, что пользователь должен разрешить приложению доступ к "Media & 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)!)
0 голосов
/ 05 декабря 2018

Вам необходимо установить объект в вашем уведомлении, чтобы иметь возможность получить nowPlayingItem.

Код должен выглядеть примерно так:

private let playerController = MPMusicPlayerController.applicationMusicPlayer

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

Тогда вы должны бытьвозможность доступа к nowPlayingItem, как это в вашей функции systemSongDidChange:

func systemSongDidChange(_ notification: Notification) {
    guard let playerController = notification?.object as? MPMusicPlayerController else {
        return
    }
    let item = playerController.nowPlayingItem
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...