MPMusicPlayerControllerNowPlayingItemDidChange непредсказуем - PullRequest
1 голос
/ 12 июня 2019

В основном MPMusicPlayerControllerNowPlayingItemDidChange очень непредсказуемо. Иногда он вызывается один раз, иногда дважды, иногда случайным образом вызывается в середине песни во время воспроизведения. Мне нужно найти способ игнорировать ложные вызовы уведомлений и обрабатывать только те моменты, когда музыкальный элемент фактически изменялся с одного элемента на другой.

Я пытался увидеть, если currentPlaybackTime == 0 и только затем обрабатывал уведомление, но иногда песни обновлялись, а время их воспроизведения не было 0. Я также пытался создать буфер, который позволяет новому элементу обновлять только определенное время после обновления старого элемента, но это действительно ненадежно, потому что в редких случаях уведомление отправляется в середине песни, когда я добавляю в очередь музыкального проигрывателя новые песни.

@objc static func appleMusicItemDidUpdate() {
        let spController = AppDelegate.songPlayerController
        let item = AppDelegate.appleMusicPlayer.nowPlayingItem

        print("got new item:", item?.title ?? "no title")

        if let item = item, let title = item.title, title != "Loading...", AppDelegate.appleMusicPlayer.currentPlaybackTime == 0 {
            if item.isCloudItem && item.playbackStoreID != "0" && item.playbackStoreID != "" {
                print("test1")
                if /*other specific check (not important)*/ true {
                    print("handling notification")
                }
            } else {
                print("test5")
                spController.lastUpdate = Date().timeIntervalSince1970
                print("handling notification")
            }
        } else {
            print("item did not pass check:")
            if item == nil {
                print("item was nil")
            }

            if item?.title == nil {
                print("title was nil")
            }

            if item?.title == "Loading..." {
                print("item was loading")
            }

            if AppDelegate.appleMusicPlayer.currentPlaybackTime >= 0.0001 {
                print("current playback time was", AppDelegate.appleMusicPlayer.currentPlaybackTime)
            }

            if !spController.passesBufferCheck() {
                print("did not pass buffer check")
            }

            print("")
        }

The notification gets called randomly and sometimes gets called multiple times when a song is updated and I can't find a reliable way to check for an actual update.
...