Как правильно обработать ошибку AVPlayer HTTP? - PullRequest
0 голосов
/ 05 января 2019

При запросе воспроизведения файла mp3 с веб-сервера, если этот сервер возвращает запрещенное значение 403, неясно, как обрабатывать ошибку при проверке ошибки текущего элемента AVPlayer.

Сообщение об ошибке от AVPlayer не указывает, что это 403 ...

2019-01-05 13: 08: 33.908316-0500 Бегунок [84043: 3269818] Необязательно (ошибка Домен = AVFoundationErrorDomain Код = -11828 «Не удается открыть» UserInfo = {NSLocalizedFailureReason = Этот формат мультимедиа не поддерживается., NSLocalizedDescription = Невозможно открыть, NSUnderlyingError = 0x600000781290 {Ошибка домена = NSOSStatusErrorDomain Код = -12847 "(ноль)"}})

Ошибка говорит о том, что носитель не поддерживается, но носитель даже не был достигнут. В любом случае можно увидеть код ошибки HTTP из запросов AVPlayer?

При тестировании того же файла на Android я могу правильно увидеть код ошибки 403 с нативного Android MediaPlayer (ошибка с Android лучше и полезнее, чем AVPlayer для iOS).

Это отсутствие надлежащего обмена сообщениями об ошибках делает очень сложным корректное отображение точной ошибки пользователю.

Пример произвольного кода:

    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))")

1 Ответ

0 голосов
/ 06 января 2019

Вот возможное решение, а не инициализация AVPlayerItem с помощью URL

Вы можете попробовать этот подход

  1. Используйте AVURLAsset и установите AVAssetResourceLoaderDelegate

  2. Используйте метод делегата func resourceLoader(_ resourceLoader:AVAssetResourceLoader, didCancel authenticationChallenge: URLAuthenticationChallenge)

  3. Перейдите к созданию проигрывателя и воспроизведению аудио. Метод делегата сообщит вам, когда возникнет ошибка 403.

Вот пример кода

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))
...