ios - 如何正确处理 AVPlayer HTTP 错误?
问题描述
当请求从 Web 服务器播放 mp3 文件时,如果该服务器返回 403 禁止,则在检查 AVPlayer 当前项目错误时不清楚如何处理该错误。
来自 AVPlayer 的错误消息并不表明它是 403...
2019-01-05 13:08:33.908316-0500 Runner[84043:3269818] 可选(错误域=AVFoundationErrorDomain Code=-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()
检查错误将打印上面引用的消息。
NSLog("\(String(describing: player.currentItem?.error))")
解决方案
使用 KVO 观察 playItem 的状态,如下所示:
self.playItem.addObserver(self, forKeyPath: "status", options: .new, context: nil)
然后在方法中:
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
}
}
}
您可以在此处找到代码定义: 文档
推荐阅读
- android - 调试构建变体失败
- java - 从 Stax XMLStreamReader 读取以解组部分
- react-native - 图标不会加载到标签栏场景/堆栈中
- apollo - 如何控制 Apollo 查询缓存以提供缓存数据并检查服务器是否有更新
- javascript - Chart js中的工具提示总是黑色而不是对应数据集的颜色
- spring-data-jpa - 使用多个事务管理器没有可用的名为“transactionManager”的 bean
- angularjs - 带参数的Angularjs函数
- selenium - Yii2 验收测试 - 注意错误
- php - 有没有办法在一个视图中查看子类的整个代码(来自上层)
- javascript - Javascript字符串到C#时间跨度