Я использую https://github.com/auth0/socketio-jwt, чтобы подключить пользователя к моему серверу node.js/socket.io, и я используя одну поездку в оба конца
Моя проблема прямо сейчас заключается в том, что всякий раз, когда пользователь входит в IOS-часть, socket.connect()
несовместим, моя теория заключается в том, что токен еще не готов еще до вызова socket.connect()
.
Я использую дизайн Singleton для своего класса Socket.io, как многие люди указали на это.
Здесь код в части SocketManager.swift
import SocketIO
class SocketIOManager: NSObject {
static let sharedInstance = 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()
}
}
Я использую KeychainAccess для хранения токена, а файл Constant.Swift хранит все глобальные переменные и функции, чтобы я мог называть его любыми файлами Swift.
Constant.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.sharedInstance.establishConnection()
self.segueToAnotherVC() // Segue to another screen, to simplify things i put it in a function
}
}
}
Так технически, что происходит в этом контроллере, когда пользователь входит в систему, я буду хранить токен в KeychainAccess (это эквивалентно NSUserDefaults), тогда только я сделаю сокет-соединение, потому что соединение сокета требует токена заранее,
Что мне делать, чтобы соединение было согласованным все время, когда пользователь входит в систему? Любые методы, которые я мог бы использовать?