Sobes.tech
Junior — Middle

Come garantire la riconnessione automatica di WebSocket dopo che l'applicazione torna dallo stato minimizzato?

sobes.tech AI

Risposta dell'AI

Per ripristinare automaticamente la connessione WebSocket dopo che l'applicazione torna da uno stato minimizzato su iOS, è necessario monitorare il ciclo di vita dell'applicazione e ripristinare la connessione passando allo stato attivo.

Di solito, ciò avviene osservando le notifiche UIApplication.didBecomeActiveNotification o implementando il metodo applicationDidBecomeActive nel delegato dell'app. In quel momento, si verifica lo stato del WebSocket e, se la connessione è chiusa, si avvia una riconnessione.

Esempio in Swift usando URLSessionWebSocketTask:

import UIKit

class WebSocketManager {
    private var webSocketTask: URLSessionWebSocketTask?
    private let urlSession = URLSession(configuration: .default)
    private let url = URL(string: "wss://example.com/socket")!

    init() {
        NotificationCenter.default.addObserver(self, selector: #selector(appDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)
        connect()
    }

    func connect() {
        webSocketTask = urlSession.webSocketTask(with: url)
        webSocketTask?.resume()
        listen()
    }

    @objc private func appDidBecomeActive() {
        if webSocketTask?.state != .running {
            connect()
        }
    }

    private func listen() {
        webSocketTask?.receive { [weak self] result in
            switch result {
            case .failure(let error):
                print("Errore nella ricezione WebSocket: \(error)")
            case .success(let message):
                // Elaborazione del messaggio
                print("Messaggio ricevuto: \(message)")
                self?.listen() // continuare ad ascoltare
            }
        }
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
        webSocketTask?.cancel(with: .goingAway, reason: nil)
    }
}

In questo modo, ogni volta che l'app torna allo stato attivo, viene verificato e, se necessario, ristabilita la connessione WebSocket.