Socket.connect () no es consistente cuando se usa connectParams con JWT

Estoy usando https://github.com/auth0/socketio-jwt para conectar el usuario a mi server node.js / socket.io y estoy usando un viaje de ida y vuelta

Mi problema en este momento es que cada vez que el usuario inicia session en la parte IOS, socket.connect() no es consistente, mi teoría es que el token aún no está listo, incluso antes de que socket.connect() sea ​​invocado.

Estoy usando el layout Singleton para mi class Socket.io, ya que muchas personas lo señalaron.

Aquí está el código en la parte SocketManager.swift

 import SocketIO class SocketIOManager: NSObject { static let shanetworkingInstance = SocketIOManager() var socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": getToken()])]) // getToken() I got it from other file which is Constant.Swift func establishConnection() { socket.connect() } func closeConnection() { socket.disconnect() } } 

Estoy usando KeychainAccess para almacenar el token y el file Constant.Swift almacena todas las variables y funciones globales para poder llamarlo en cualquier file Swift.

Constante.Swift

 import Foundation import KeychainAccess let keychain = Keychain(server: "www.example.com", protocolType: .https) func getToken() -> String { if let token = keychain["token"] { return token } return "" } 

LoginViewController.swift

 @IBAction func facebookButtonClicked(_ sender: UIButton) { Alamofire.request("/login", method: .post, parameters: parameters, encoding: JSONEncoding.default) .responseJSON { response in if let value = response.result.value { let json = JSON(value) self.keychain["token"] = String(describing: json["token"]) SocketIOManager.shanetworkingInstance.establishConnection() self.segueToAnotherVC() // Segue to another screen, to simplify things i put it in a function } } } 

Entonces, técnicamente, lo que está sucediendo en este controller es cuando el usuario inicia session, saveé el token en KeychainAccess (es equivalente a NSUserDefaults), entonces solo haré una connection de socket porque la connection de socket necesita un token de antemano.

¿Qué debo hacer para que la connection sea constante todo el time, cada vez que el usuario inicie session? ¿Algún método que pueda usar?

Te sugiero que uses un llavero como este:

 let keychain = KeychainSwift() keychain.set("string", forKey: "key") keychain.get("key") keychain.delete("key") 

Llavero de uso:

 let saveBool: Bool = KeychainWrapper.setString("String", forKey: "key") let retrievedString: String? = KeychainWrapper.stringForKey("key") let removeBool: Bool = KeychainWrapper.removeObjectForKey("key") 

Y asegúrese de que su token esté configurado cuando llame a establecer connection, de lo contrario, no intente conectarse.

Referencias:

https://github.com/socketio/socket.io-client-swift/issues/788

https://github.com/marketplacer/keychain-swift

https://github.com/jrendel/SwiftKeychainWrapper

Más información:

JSON Web Token es un estándar abierto basado en JSON para crear tokens de acceso que afirman un cierto número de reclamaciones.