Swift: GET-запрос с приложением / октет-потоком в ответ - PullRequest
1 голос
/ 17 января 2020

У меня есть следующий GET запрос (краткая версия для объяснения) для воспроизведения звука:

func playSound() {

        guard let url = URL(string: "https://someWebsite/api/sounds/play?id=1") else {fatalError() }

        var request = URLRequest(url: url)

        request.httpMethod = "GET"

        request.setValue(uuid, forHTTPHeaderField: "X-AUTH-Device")
        request.setValue(appid, forHTTPHeaderField: "X-AUTH-AppID")
        request.setValue(someToken, forHTTPHeaderField: "X-AUTH-Token")

        URLSession.shared.dataTask(with: request) { data, response, _ in
            guard let httpResponse = response as? HTTPURLResponse,
                (200...599).contains(httpResponse.statusCode),
                let mediaData = data else {
                    return
            }
            print(mediaData)
        }
        .resume()
}

Таким образом, в mediaData я получаю некоторые данные, и все, что я знаю, это то, что они должны быть потоком типа (Content-Type: application/octet-stream). Поэтому я застрял в понимании того, как декодировать / обрабатывать эти мультимедийные данные для воспроизведения в AVPlayer или других проигрывателях. Кроме того, я попытался добавить URL и заголовки в AVPlayer без запроса get, но это не сработало, и я не уверен, какой подход использовать здесь. Заранее благодарю за помощь!

1 Ответ

0 голосов
/ 20 января 2020

Это работает для меня: https://github.com/neekeetab/CachingPlayerItem

И в коде:

   ...URLSession.shared.dataTask(with: request) { data, response, _ in
            guard let httpResponse = response as? HTTPURLResponse,
                (200...599).contains(httpResponse.statusCode),
                let mediaData = data else {
                    return
            }
            self.playSound(data: mediaData)
        }
        .resume()
}

func playSound(data: Data) {
    let playerItem = CachingPlayerItem.init(data: data, mimeType: "audio/mpeg", fileExtension: ".mp3")
    player = AVPlayer(playerItem: playerItem)
    guard let player = player else { return }
    player.play()
}
...