Socket.connect() несовместим при использовании connectParams с JWT
Я использую 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), тогда только я сделаю сокет-соединение, потому что соединение сокета требует токена заранее,
Что мне делать, чтобы соединение было согласованным все время, когда пользователь входит в систему? Любые методы, которые я мог бы использовать?
Ответы
Ответ 1
Я предлагаю вам использовать keychain, как это:
let keychain = KeychainSwift()
keychain.set("string", forKey: "key")
keychain.get("key")
keychain.delete("key")
keychain Использование:
let saveBool: Bool = KeychainWrapper.setString("String", forKey: "key")
let retrievedString: String? = KeychainWrapper.stringForKey("key")
let removeBool: Bool = KeychainWrapper.removeObjectForKey("key")
И убедитесь, что ваш токен установлен при вызове установления соединения, если нет, не пытайтесь подключиться.
Ссылки:
https://github.com/socketio/socket.io-client-swift/issues/788
https://github.com/marketplacer/keychain-swift
https://github.com/jrendel/SwiftKeychainWrapper
Дополнительная информация:
JSON Web Token - открытый стандарт JSON для создания токенов доступа, которые утверждают некоторое количество претензий.