Обновить
0
0
Павел@Woofych

Пользователь

Отправить сообщение
Весь код сюда пихать не стану, лишь часть примера ради
Буквально на днях пилил себе такой менеджер.
Только для нашего сервера пришлось его сделать не на уровне простой 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)")
            })


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

Информация

В рейтинге
Не участвует
Откуда
Комсомольск-на-Амуре, Хабаровский край, Россия
Дата рождения
Зарегистрирован
Активность