Sobes.tech
Junior — Middle

როგორ უზრუნველვყოთ WebSocket-ის ავტომატური ხელახლა დაკავშირება პროგრამის მინიმალიზებული მდგომარეობიდან დაბრუნების შემდეგ?

sobes.tech AI

პასუხი AI-სგან

ავტომატური 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-ის ხელახლა დაკავშირება.