Я разработал приложение для чата, которое использует 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) {
...
}