如何正确处理AVPlayer HTTP错误?

Ant*_*onB 4 ios avplayer swift

当请求从 Web 服务器播放 mp3 文件时,如果该服务器返回 403 禁止,则不清楚在检查 AVPlayer 当前项目错误时如何处理该错误。

来自 AVPlayer 的错误消息并不表明它是 403...

2019-01-05 13:08:33.908316-0500 Runner[84043:3269818]可选(错误域=AVFoundationErrorDomain代码=-11828“无法打开”UserInfo={NSLocalizedFailureReason=不支持此媒体格式。,NSLocalizedDescription=无法打开, NSUnderlyingError=0x600000781290 {错误域=NSOSStatusErrorDomain代码=-12847“(null)”}})

该错误表示不支持该媒体,但从未访问过该媒体。有没有办法从 AVPlayer 请求中查看 HTTP 错误代码?

在 Android 上测试同一文件时,我能够正确地看到 Android 原生的 403 错误代码MediaPlayer(Android 的错误比 iOS 的 AVPlayer 更好、更有用)。

缺乏正确的错误消息传递使得很难向用户优雅地显示准确的错误。

任意代码示例:

    let url = URL(string: "some 403 server url")
    let playerItem:AVPlayerItem = AVPlayerItem(url: url!)
    player = AVPlayer(playerItem: playerItem)
    player.play()
Run Code Online (Sandbox Code Playgroud)

检查错误将打印上面引用的消息。

NSLog("\(String(describing: player.currentItem?.error))")
Run Code Online (Sandbox Code Playgroud)

小智 8

使用 KVO 观察 playItem 的状态,如下所示:

self.playItem.addObserver(self, forKeyPath: "status", options: .new, context: nil)
Run Code Online (Sandbox Code Playgroud)

然后在方法中:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        let playerItem = object as! AVPlayerItem
        if keyPath == "status", playerItem.status == .failed{
            if let error = playerItem.error as NSError? {
                let errorCode = error.code
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到代码定义: 文档