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),然后我才会建立套接字连接,因为套接字连接需要预先设置一个令牌.
无论何时用户登录,我该怎么做才能使连接始终保持一致?我可以使用的任何方法?
我建议你像这样使用钥匙串:
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 的开放标准,用于创建断言一定数量声明的访问令牌。
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |