我使用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()
}
}
我使用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),然后我才会建立套接字连接,因为套接字连接需要预先设置一个令牌。
每当用户登录时,我该怎么做才能使连接始终保持一致?我可以用的任何方法吗?
答案 0 :(得分:1)
我建议您使用这样的钥匙串:
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的开放标准,用于创建声明一些声明的访问令牌。