将connectParams与JWT一起使用时,Socket.connect()不一致

sin*_*Gob 17 ios socket.io jwt swift

我正在使用https://github.com/auth0/socketio-jwt将用户连接到我的node.js/socket.io服务器,我正在使用一次往返

我现在的问题是,无论何时用户登录IOS部分,socket.connect()都不一致,我的理论是,即使在socket.connect()被调用之前,令牌还没有准备就绪.

我正在为我的Socket.io类使用Singleton设计,因为许多人指出了这一点.

这是该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()
    }       
}
Run Code Online (Sandbox Code Playgroud)

我正在使用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 ""
}
Run Code Online (Sandbox Code Playgroud)

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
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

所以从技术上来说,在这个控制器中发生的事情是,当用户登录时,我会将令牌存储到KeychainAccess中(它相当于NSUserDefaults),然后我才会建立套接字连接,因为套接字连接需要预先设置一个令牌.

无论何时用户登录,我该怎么做才能使连接始终保持一致?我可以使用的任何方法?

Far*_*had 1

我建议你像这样使用钥匙串:

let keychain = KeychainSwift()
keychain.set("string", forKey: "key")
keychain.get("key")
keychain.delete("key")
Run Code Online (Sandbox Code Playgroud)

钥匙扣用途:

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

并确保在调用建立连接时设置了您的令牌,如果没有,请不要尝试连接。

参考:

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 的开放标准,用于创建断言一定数量声明的访问令牌。