Весь код сюда пихать не стану, лишь часть примера ради
Буквально на днях пилил себе такой менеджер.
Только для нашего сервера пришлось его сделать не на уровне простой URL, а через URL Request. Так появилась возможность использовать хеддер авторизации и дополнительный query в URL:
final class WebSocket: NSObject {
private var urlSession: URLSession?
private var webSocketTask: URLSessionWebSocketTask?
init?(host: String, path: String, headers: [String: String], parameters: [String: String]) {
super.init()
urlSession = URLSession(configuration: .default,
delegate: self,
delegateQueue: nil)
var urlComponents = URLComponents()
urlComponents.scheme = "wss"
urlComponents.host = host
urlComponents.path = path
var items: [URLQueryItem] = []
for (key, value) in parameters {
let qItem = URLQueryItem(name: key, value: value)
items.append(qItem)
}
if items.count > 0 {
urlComponents.queryItems = items
}
guard let url = urlComponents.url else {
log.error("Could not create URL from components")
return nil
}
log.info("Socket URL: \(url.absoluteString)")
var request = URLRequest(url: url)
request.timeoutInterval = 30
headers.forEach { (key, value) in
request.addValue(value, forHTTPHeaderField: key)
}
webSocketTask = urlSession?.webSocketTask(with: request)
}
}
Плюс, для удобства сделал все на колбэках вместо делегата, в итоге конечное использование выглядит примерно так:
let websocket = WebSocket(host: server,
path: "/dash_wss",
headers: headers,
parameters: parameters)
websocket?
.connect()
.onConnected(callback: {
log.info("Socket connected")
})
.onDisconnected(callback: { (error) in
log.info("Socket disconnected with error: \(error?.localizedDescription ?? "No error")")
})
.onError(callback: { (error) in
log.error("Socket error \(error)")
})
.onTextMessage(callack: { (message) in
log.info("Socket message \(message)")
})
Делать синглтон из него не стал, так как используется только для одного экрана
Если кому надо полный код, могу запилить в гитхабе.
Если будут замечания, корректировки, буду рад принять
Буквально на днях пилил себе такой менеджер.
Только для нашего сервера пришлось его сделать не на уровне простой URL, а через URL Request. Так появилась возможность использовать хеддер авторизации и дополнительный query в URL:
Плюс, для удобства сделал все на колбэках вместо делегата, в итоге конечное использование выглядит примерно так:
Делать синглтон из него не стал, так как используется только для одного экрана
Если кому надо полный код, могу запилить в гитхабе.
Если будут замечания, корректировки, буду рад принять