Как передать базовую аутентификацию HTTP в AVAudioPlayer в Swift 4 - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь загрузить удаленный MP3 через AVAudioPlayer в Swift 4. Пока все работает просто замечательно.

Теперь я пытаюсь загрузить наш безопасный URL-адрес, который использует для аутентификации базовую аутентификацию.

У меня есть следующее:

    let username = "my_username"
    let password = "my_password"
    let loginString = String(format: "%@:%@", username, password)
    let loginData = loginString.data(using: String.Encoding.utf8)!
    let base64LoginString = loginData.base64EncodedString()

    // create the request
    let url = URL(string: "https://audio.my_domain.com/\(hashKey)/my_file.mp3")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")

    guard let audioPlayer = try? AVAudioPlayer(contentsOf: request) else {
        self.endPlayback()
        return
    }

Конечно,я получаю следующую ошибку:

Невозможно преобразовать значение типа 'URLRequest' в ожидаемый тип аргумента 'URL'

Я не удивлен этим как URL не является URLRequest объектом.Итак, мой вопрос.Как я могу загрузить поток URL-адресов в AVAudioPlayer с использованием обычной HTTP-аутентификации?

Я не могу найти нигде, где это делается.Возможно, это невозможно?

1 Ответ

0 голосов
/ 17 мая 2018

Прежде всего, AVAudioPlayer не предназначен для воспроизведения звука по сети :

Используйте этот класс для воспроизведения звука, если только вы не воспроизводите звук, захваченный из сетевого потока, или не требует очень низкой задержки ввода-вывода.

Вы должны либо загрузить весь mp3-файл в локальный файл, либо в объект Data перед воспроизведением, либо использовать вместо него AVPlayer (который предназначен для воспроизведения аудио по сети).

Чтобы создать AVPlayer, который воспроизводит аудио по сети, сначала необходимо создать AVURLAsset:

let asset = AVURLAsset(url: URL(string: "https://example.com/file.mp3")!)

Существует как минимум два способа использования базовой аутентификации с AVURLAsset:

  1. Используйте AVURLAssetHTTPHeaderFieldsKey , чтобы установить пользовательский заголовок. Обратите внимание, что этот ключ не имеет документов.

  2. Добавить учетные данные для общего доступа URLCredentialStorage:

    let credential = URLCredential(
        user: "username",
        password: "password", 
        persistence: .forSession
    )
    let protectionSpace = URLProtectionSpace(
        host: "example.com",
        port: 443,
        protocol: "https",
        realm: nil,
        authenticationMethod: NSURLAuthenticationMethodHTTPBasic
    )
    URLCredentialStorage.shared.setDefaultCredential(credential, for: protectionSpace)
    

Затем вы можете создать AVPlayerItem с вашим активом и, наконец, AVPlayer:

let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
...