Sobes.tech
Junior — Middle

Kako osigurati automatsko ponovno uspostavljanje veze WebSocket nakon povratka aplikacije iz smanjenog stanja?

sobes.tech АИ

Одговор од АИ

Да бисте аутоматски поново успоставили WebSocket везу након што се апликација врати из минимизованог стања на iOS-у, потребно је пратити животни циклус апликације и поново успоставити везу када прелазите у активно стање.

Обично се то ради праћењем обавештења UIApplication.didBecomeActiveNotification или имплементацијом методе applicationDidBecomeActive у делегату апликације. У том тренутку, проверава се стање WebSocket-а и, ако је веза затворена, иницира се поновно повезивање.

Пример у Swift-у са коришћењем 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("Грешка при пријему WebSocket-а: \(error)")
            case .success(let message):
                // Обрада поруке
                print("Примљена порука: \(message)")
                self?.listen() // наставити слушање
            }
        }
    }

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

На овај начин, сваки пут када се апликација врати у активни режим, проверава се стање и, ако је потребно, поново се успоставља WebSocket веза.