Sobes.tech
Junior — Middle

Ilova minimallashtirilgan holatdan qaytgach, WebSocketning avtomatik qayta ulanishini qanday ta'minlash mumkin?

sobes.tech AI

AIdan javob

iOS-да иловадан чиқишдан кейин WebSocket уланишини автоматик тиклаш учун, илова ҳаёти циклін кузатиш ва фаол ҳолатга ўтганда уланишни тиклаш керак.

Одатида, бу 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 қайта уланади.