当请求从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原生MediaPlayer
的403错误代码(来自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))")
这是一个可能的解决方案,而不是用url初始化AVPlayerItem
你可以尝试这种方法
AVURLAsset
并设置AVAssetResourceLoaderDelegate
func resourceLoader(_ resourceLoader:AVAssetResourceLoader, didCancel authenticationChallenge: URLAuthenticationChallenge)
这是示例代码
class ResourceLoadingDelegate:NSObject, AVAssetResourceLoaderDelegate {
func resourceLoader(_ resourceLoader: AVAssetResourceLoader,
didCancel authenticationChallenge: URLAuthenticationChallenge) {
/// handle the authentication challenge
print(authenticationChallenge.error.debugDescription)
}
}
let asset = AVURLAsset(url: URL(string: "some 403 url")!)
asset.resourceLoader.setDelegate(ResourceLoadingDelegate(), queue: DispatchQueue.global(qos: .userInitiated))