Variante de travail avec les sockets web dans iOS dans Swift / A écrit un gestionnaire pour travailler avec websocket

Bonjour à tous.

Il y a 4 ans, je travaillais déjà avec des sockets web dans iOS, puis j'ai résolu le problème en utilisant l'une des bibliothèques de cocoapods, l' article est sur Habré . Et aujourd'hui, je veux démontrer une autre solution, native sans cocoapods.

J'ai écrit mon gestionnaire pour travailler avec des sockets Web (le gestionnaire dans ce cas est une classe singleton qui peut être appelée n'importe où dans l'application, car cette instance singleton ne sera créée qu'une seule fois pour l'application entière).

J'utiliserai des moyens natifs à mes fins.

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) //          } } 

Voici un tel manager, un exemple d'appel

 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 //              } } } 

* sur l'adresse
wss: // ceci est un analogue de https: //
ws: // ceci est un analogue de http: //

C'est l'option pour travailler avec la prise Web qui s'est avérée, si vous avez des questions, des suggestions, des enseignements sur la façon de faire mieux, écrivez, je serai heureux :)

Un cas de test est disponible dans mon github

J'utilise également l'extension pour Decodable qui est également disponible dans mon github
Je parle de cette partie

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

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


All Articles