मैं अपने Node.js/socket.io सर्वर से कनेक्ट करने के लिए उपयोगकर्ता https://github.com/auth0/socketio-jwt उपयोग कर रहा हूँ नहीं है और मैं एक राउंड ट्रिपSocket.connect() संगत जब जेडब्ल्यूटी
मेरे समस्या सही उपयोग कर रहा हूँ अब यह है कि जब भी उपयोगकर्ता आईओएस भाग पर लॉग इन करता है, तो socket.connect()
सुसंगत नहीं है, मेरा सिद्धांत यह है कि socket.connect()
से पहले टोकन अभी भी तैयार नहीं है।
मैं अपने सॉकेट.ओ क्लास के लिए सिंगलटन डिज़ाइन का उपयोग कर रहा हूं क्योंकि बहुत से लोगों ने इसकी ओर इशारा किया है।
यहाँ 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 फ़ाइल दुकान सभी वैश्विक चर और कार्यों को स्टोर करने के लिए इतना है कि मैं किसी भी स्विफ्ट फाइलों पर यह कह सकते हैं पर कोड है।
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 के बराबर है), तो केवल मैं सॉकेट कनेक्शन बनाउंगा क्योंकि सॉकेट कनेक्शन को पहले से टोकन की आवश्यकता होती है।
जब भी उपयोगकर्ता लॉग इन करता है, कनेक्शन को लगातार बनाए रखने के लिए मुझे क्या करना चाहिए? कोई भी तरीका जिसका मैं उपयोग कर सकता हूं?
यदि आप कीचैन पहुंच के बजाय NSUserDefaults का उपयोग करते हैं तो यह ठीक काम करता है? क्या आपने इसे पहले से ही कोशिश की है? इसके अलावा, मैं आपको यह जांचने के लिए सुझाव दूंगा कि GetToken विधि सही टोकन लौट रही है या नहीं। –
इसके अतिरिक्त, मुझे लगता है कि आपको इस तरह की चाबी का उपयोग करना चाहिए: 'https: // stackoverflow।कॉम/प्रश्न/24324285/जोड़-आइटम-टू-एंड-क्वेरीिंग-द-आईओएस-कीचेन-साथ-स्विफ्ट ' शेष कोड मुझे ठीक लग रहा है, लेकिन KeyChain के लिए मुझे यकीन नहीं है कि आप इसका उपयोग कर रहे हैं सही तरीका –
@ मोहिनीशिरुद्रकर यह सही टोकन लौटाता है जिसे मैं पहले से ही देखता हूं, क्योंकि जब मैं 'app.delegate' में कनेक्शन स्थापित करता हूं, तो यह काम करता है, मुझे विश्वास है कि टोकन समय का निर्माण यहां समस्या है। – sinusGob