Variante de trabajar con sockets web en iOS en Swift / Escribió un administrador para trabajar con sockets web

Hola a todos

Hace 4 años ya estaba tratando con sockets web en iOS, luego resolví el problema usando una de las bibliotecas de cocoapods, el artículo está en Habré . Y hoy quiero demostrar otra solución, nativa sin cocoapods.

Escribí a mi administrador para trabajar con sockets web (el Administrador en este caso es una clase singleton a la que se puede llamar en cualquier lugar de la aplicación, ya que esta instancia única se creará solo una vez para toda la aplicación).

Usaré medios nativos para mis propósitos.

import Foundation class WSManager { public static let shared = WSManager() //   private init(){} private var dataArray = [__]() let webSocketTask = URLSession(configuration: .default).webSocketTask(with: URL(string: "wss://__"*)) //   public func connectToWebSocket() { webSocketTask.resume() self.receiveData() { _ in } } //     public func subscribeBtcUsd() { let message = URLSessionWebSocketTask.Message.string("SUBSCRIBE: __") webSocketTask.send(message) { error in if let error = error { print("WebSocket couldn't send message because: \(error)") } } } //     public func unSubscribeBtcUsd() { let message = URLSessionWebSocketTask.Message.string("UNSUBSCRIBE: __ ") webSocketTask.send(message) { error in if let error = error { print("WebSocket couldn't send message because: \(error)") } } } //  ,       func receiveData(completion: @escaping ([__]?) -> Void) { webSocketTask.receive { result in switch result { case .failure(let error): print("Error in receiving message: \(error)") case .success(let message): switch message { case .string(let text): let data: Data? = text.data(using: .utf8) let srvData = try? CODABLE_____.decode(from: data ?? Data()) for singleData in srvData ?? [] { self.dataArray.append(__(1: singleData.parametr1, 2: singleData.parametr2, 3: singleData.parametr3)) } case .data(let data): //         print("Received data: \(data)") @unknown default: debugPrint("Unknown message") } self.receiveData() {_ in } //  } } completion(self.dataArray) //          } } 

Aquí hay un administrador, una llamada de ejemplo

 import UIKit class MainViewController: UIViewController { private var dataArray = [__]() override func viewDidLoad() { super.viewDidLoad() WSManager.shared.connectToWebSocket() //  WSManager.shared.subscribeBtcUsd() //    self.getData() //  } private func getData() { //  WSManager.shared.receiveData() { [weak self] (data) in guard let self = self else { return } guard let data = data else { return } self.dataArray = data //              } } } 

* sobre la dirección
wss: // este es un análogo de https: //
ws: // este es un análogo de http: //

Esta es la opción para trabajar con el socket web, si tiene preguntas, sugerencias, enseñanzas sobre cómo hacerlo mejor, escriba, me alegrará :)

Un caso de prueba está disponible en mi github

También uso la extensión para Decodable que también está disponible en mi github
Estoy hablando de esta parte

 let srvData = try? CODABLE_____.decode(from: data ?? Data()) 

Source: https://habr.com/ru/post/485468/


All Articles