#ios #networking #http2 #alexa-voice-service #urlsession
#iOS #сеть #http2 #alexa-голосовой сервис #urlsession
Вопрос:
Я пытаюсь создать клиентскую часть iOS для голосовых сервисов Alexa. Я застрял на сетевом уровне.
Взаимодействие с Alexa Server требует создания в основном двух потоков по одному соединению. После установления соединения с сервером вы открываете нисходящий канал потока, который будет в наполовину закрытом состоянии. нисходящий канал будет использоваться сервером для отправки директив, таких как уведомления, сигналы тревоги и т.д.(например, если вы попросите Alexa установить будильник через 5 минут, вы получите указание включить будильник на этом канале через 5 минут). нисходящий канал будет открыт до тех пор, пока активен сеанс с Alexa. Другой поток будет запускаться всякий раз, когда пользователь начинает аудиосессию с Alexa. Этот поток будет использоваться для отправки фрагментов аудио, пока мы не получим директиву end.Затем этот поток будет закрыт. Более подробная информация здесь
Я пытаюсь реализовать это, используя streamTaskWithHostName(:PortNumber:) URLSession. Итак, для простого HTTP-запроса, если я отправляю HTTP-запрос, я могу прочитать ответ, и мне просто нужно проанализировать заголовок и тело в соответствии со стандартами.
let request = "GET / HTTP/1.1 rnHost: localhostrnrn"
streamTask = session.streamTask(withHostName: "localhost", port: 8080)
let getRequest = request.data(using: .utf8)!
streamTask.write(getRequest, timeout: 60) {
error in
debugPrint("Error is (error?.localizedDescription) )")
if error == nil {
self.streamTask.readData(ofMinLength: 4096, maxLength: 4096, timeout: 20) {
data, bool, error in
if let extractedData = data {
let dataString = String(data: extractedData, encoding: .utf8)
debugPrint("Data received is (dataString!)")
}
debugPrint("Bool = (bool) error = (error?.localizedDescription)")
}
}
}
streamTask.resume()
Данные, которые я читаю, это
Data received is HTTP/1.1 200 rnDate: Tue, 26 Mar 2019 06:08:33 GMTrnServer: Apache/2.4.38 (Unix)rnContent-Length: 226rnConnection: closernContent-Type: text/html; charset=iso-8859-1rnrn<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">n<html><head>n<title>it works</title>n</head><body>n<h1>it workst</h1>n<p>it works.<br />n</p>n</body></html>n"
Но когда я пытаюсь создать потоковую задачу http2, я ничего не могу прочитать.
:method = GET
:scheme = https
:path = /{{API version}}/directives
authorization = Bearer {{YOUR_ACCESS_TOKEN}}
1.Is это из-за того, что http2 является двоичным протоколом вместо обычного текста, а заголовок сжимается с использованием HPACK?
2. Если да, то нужно ли мне самому реализовать сжатие заголовка, создание фрейма и запись в stream согласно документации или есть какая-то конфигурация в URLSessionConfiguration, которая сделает это за меня, даже если я укажу простые заголовки, как в URLRequests?
3. Можете ли вы помочь мне с некоторыми библиотеками, которые могут помочь мне в достижении того же.