All streams
Search
Write a publication
Pull to refresh
0
0
Павел @Woofych

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

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


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

Information

Rating
Does not participate
Location
Комсомольск-на-Амуре, Хабаровский край, Россия
Date of birth
Registered
Activity