Swift Socket.io - Воссоединение странного поведения - PullRequest
0 голосов
/ 05 февраля 2019

Я разработал приложение для чата, которое использует Socket.io для обмена сообщениями в реальном времени.

На localhost все работает нормально, но на реальном устройстве - нет.


Проблема с переподключением.Если я установлю reconnects = true, он будет подключаться и отключаться каждые полсекунды.

Если я отключу это и использую socket.connect() вручную через несколько секунд, это не вызовет такого странного поведения.

Почему это так?

Swift

class SocketIOManager: NSObject, URLSessionDelegate {
    static var shared = SocketIOManager()

    var setuppedManager : Bool = false

    var manager : SocketManager!
    let socket : SocketIOClient!
    var authenticated : Int = 0

    override init() {
        self.setuppedManager = false


        manager = SocketManager(socketURL: URL(string: "https://example.com/node")!, config: [.log(true), .compress, .reconnects(false), .secure(true), .path("/node/socket.io/")])

        self.socket = manager.defaultSocket
        super.init()
    }

    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        completionHandler(URLSession.AuthChallengeDisposition.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    }

    func establishConnection() {
        manager.handleQueue.async {
            self.socket.connect()
        }

    }

    func closeConnection() {
        manager.handleQueue.async {
            self.socket.disconnect()
            self.socket.removeAllHandlers()
        }
    }

    func setUpManager(completion: @escaping (ActionResult?)->()){

        if setuppedManager {
            return
        }

        setuppedManager = true

        manager.handleQueue.async {

            self.socket.on("connect") { data, ack in
                self.socket.emit("authenticate", ["token" : chatToken.token ])
                NotificationCenter.default.post(name: .socketIOStatusChanged, object: nil, userInfo: nil)
            }
            self.socket.on("disconnect"){ data, ack in

                NotificationCenter.default.post(name: .socketIOStatusChanged, object: nil, userInfo: nil)
            }
            self.socket.on("reconnect"){ data, ack in
                NotificationCenter.default.post(name: .socketIOStatusChanged, object: nil, userInfo: nil)
            }
            self.socket.on("reconnectAttempt"){ data, ack in
                NotificationCenter.default.post(name: .socketIOStatusChanged, object: nil, userInfo: nil)
            }


            self.socket.on("authenticated") { data, ack in
                self.authenticated = 1
                self.socket.emit("subscribe")
                NotificationCenter.default.post(name: .socketIOStatusChanged, object: nil, userInfo: nil)

            }
            self.socket.on("unauthorized") { data, ack in
                self.authenticated = -1

                NotificationCenter.default.post(name: .socketIOStatusChanged, object: nil, userInfo: nil)

            }
        }
    }
}

Первоначально я использовал следующую конфигурацию:

.reconnects(true), .reconnectAttempts(-1), .reconnectWait(4), 

Но, как я уже говорил, это вызвалобесконечный цикл подключения и отключения ..

Серверная сторона

io.sockets.on('connect', socketioJwt.authorize({
    secret: 'mySecret',
    timeout: 10000,
    reconnection: false,
    reconnectionAttempts: -1,
    forceNew: false,
    rejectUnauthorized : false
})).on('authenticated', function(socket) {
   ...
}
...