MPMusicPlayerController.applicationQueuePlayer 在 iOS 13.4 中的错误

ali*_*der 10 ios mpmediaplayercontroller

我已经在反馈助手中提交了关于此的反馈,但我想我也会在这里发布 - 从 iOS 13.4 开始,我注意到 MediaPlayer 框架中的各种错误,特别是 applicationQueuePlayer 和 applicationMusicPlayer。

第一个是在应用程序启动时初始化,它现在抛出此错误:

[SDKPlayback] applicationQueuePlayer _establishConnectionIfNeeded timeout [ping did not pong]

当调用 prepareToPlay() 时,该错误紧随其后:

Error Domain=MPMusicPlayerControllerErrorDomain Code=6 "Failed to prepare to play" UserInfo={NSDebugDescription=Failed to prepare to play}

最终,在调用 prepareToPlay 足够多次之后,它会直接开始播放内容,但即便如此,我发现我必须多次调用 play() 或 pause() 才能可靠地执行此操作。

还有其他人在 13.4 之后的应用中看到过这个吗?

Geo*_*ski 1

几天来,我一直在摸不着头脑,为什么我无法播放 Apple Music 目录或库内容的商店标识符。事实证明,直接设置商店标识符MPMusicPlayerApplicationController将播放内容,而使用MPMusicPlayerStoreQueueDescriptor并将其传递给则MPMusicPlayerApplicationController不会产生任何效果。

我仍然收到以下错误日志:

[SDKPlayback] applicationQueuePlayer _establishConnectionIfNeeded timeout [ping did not pong]

[core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)""

iTunesCloud] ACAccountStore 0x283e1bdb0 - Error retrieving iTunesStore accounts. err=Error Domain=com.apple.accounts Code=9 "(null)"

[iTunesCloud] [ICUserIdentityStore] Failed to fetch local store account with error: Error Domain=com.apple.accounts Code=9 "(null)".

...但已经消失了Error Domain=MPMusicPlayerControllerErrorDomain Code=6 "Failed to prepare to play" UserInfo={NSDebugDescription=Failed to prepare to play}

希望这对于其他遇到这个问题的人来说可能有用:)

这是一些代码,以便您明白我的意思:

class AMPlayer {

    private(set) var player: MPMusicPlayerController!
    // Every time `queue` is set, it'll ensure the player queue is "updated"
    private var queue: MPMusicPlayerStoreQueueDescriptor! {
        didSet {
            guard self.queue != nil,
                  let storeIDs = self.queue.storeIDs,
                  !storeIDs.isEmpty
            else { return }

            self.player.setQueue(with: storeIDs)
        }
    }
    
    // This is how I set the queue from outside the class
    public func setQueue(with resourceIDs: [String]) {
        self.queue = MPMusicPlayerStoreQueueDescriptor(storeIDs: resourceIDs)
    }

    // This is how I start playback
    public func play() {
        self.player.prepareToPlay { (error) in
            if let error = error as? MPError {
                print("Error while preparing to play: \(error)")
            } else {
                self.player.play()
            }
        }
    }

}

Run Code Online (Sandbox Code Playgroud)