Sobes.tech
Middle

Koki sprendimą naudojote dirbdami su WebSocket?

sobes.tech AI

Atsakymas iš AI

Dar darbui su WebSocket iOS programose naudoju keletą požiūrių. Pagrindinis natūralus būdas yra naudoti URLSessionWebSocketTask, kuris yra prieinamas nuo iOS 13.

Senesnėms iOS versijoms arba kai reikalingos pažangesnės funkcijos (pvz., automatinis prisijungimo atkūrimas, pingai ryšio palaikymui), naudoju trečiųjų šalių bibliotekas.

URLSessionWebSocketTask (iOS 13+):

Privalumai:

  • Natūralus API, integruotas su URLSession.
  • Nereikia išorinių priklausomybių.
  • Palaiko teksto ir binarinių žinučių siuntimą ir gavimą.

Trūkumai:

  • prieinamas tik nuo iOS 13.
  • Reikalinga rankinė logikos, susijusios su prisijungimo atkūrimu, pingais ir kitomis papildomomis funkcijomis, įgyvendinimas.

Naudojimo pavyzdys:

// Būtini framework'ai
import Foundation

// WebSocket URL sukūrimas
guard let url = URL(string: "ws://example.com/socket") else {
    return // URL klaidos apdorojimas
}

// Sesijos sukūrimas
let session = URLSession(configuration: .default)

// WebSocket užduoties sukūrimas
let webSocketTask = session.webSocketTask(with: url)

// Užduoties paleidimas
webSocketTask.resume()

// Teksto žinutės siuntimas
webSocketTask.send(.string("Hello, server!")) { error in
    if let error = error {
        // Siuntimo klaidos apdorojimas
        print("WebSocket siuntimo klaida: \(error)")
    }
}

// Žinučių gavimas
func receiveMessage() {
    webSocketTask.receive { result in
        switch result {
            case .failure(let error):
                // Gavimo klaidos apdorojimas
                print("WebSocket gavimo klaida: \(error)")
            case .success(let message):
                switch message {
                    case .string(let text):
                        // Teksto žinutės apdorojimas
                        print("Gauta teksto žinutė: \(text)")
                    case .data(let data):
                        // Binarinės žinutės apdorojimas
                        print("Gauti duomenys: \(data)")
                    @unknown default:
                        // Nežinomas žinutės tipas
                        fatalError()
                }
                // Rekursinis kvietimas kitai žinutei gauti
                self.receiveMessage()
        }
    }
}

// Pradėti žinučių gavimą
receiveMessage()

// Užbaigti ryšį (pvz., išeinant iš ekrano)
webSocketTask.cancel(with: .goingAway, reason: nil)

Trečiųjų šalių bibliotekos (pvz., Starscream):

Privalumai:

  • Suderinama su senesnėmis iOS versijomis.
  • Dažnai siūlo papildomas funkcijas "iš dėžutės": automatinį prisijungimo atkūrimą, pingus, patogesnį API.
  • Aktyvi bendruomenė ir palaikymas.

Trūkumai:

  • Papildoma priklausomybė projekte.
  • Reikia stebėti bibliotekos atnaujinimus.

Konkretaus sprendimo pasirinkimas priklauso nuo reikalaujamos iOS versijos, funkcionalumo sudėtingumo ir pageidavimų naudoti trečiųjų šalių bibliotekas. Dauguma naujų projektų, palaikančių iOS 13+, pradėčiau nuo URLSessionWebSocketTask ir pridėčiau trečiųjų šalių biblioteką, jei reikalingos papildomos galimybės.