2017-08-29 27 views
16
साथ connectParams का उपयोग कर

मैं अपने 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 के बराबर है), तो केवल मैं सॉकेट कनेक्शन बनाउंगा क्योंकि सॉकेट कनेक्शन को पहले से टोकन की आवश्यकता होती है।

जब भी उपयोगकर्ता लॉग इन करता है, कनेक्शन को लगातार बनाए रखने के लिए मुझे क्या करना चाहिए? कोई भी तरीका जिसका मैं उपयोग कर सकता हूं?

+0

यदि आप कीचैन पहुंच के बजाय NSUserDefaults का उपयोग करते हैं तो यह ठीक काम करता है? क्या आपने इसे पहले से ही कोशिश की है? इसके अलावा, मैं आपको यह जांचने के लिए सुझाव दूंगा कि GetToken विधि सही टोकन लौट रही है या नहीं। –

+0

इसके अतिरिक्त, मुझे लगता है कि आपको इस तरह की चाबी का उपयोग करना चाहिए: 'https: // stackoverflow।कॉम/प्रश्न/24324285/जोड़-आइटम-टू-एंड-क्वेरीिंग-द-आईओएस-कीचेन-साथ-स्विफ्ट ' शेष कोड मुझे ठीक लग रहा है, लेकिन KeyChain के लिए मुझे यकीन नहीं है कि आप इसका उपयोग कर रहे हैं सही तरीका –

+0

@ मोहिनीशिरुद्रकर यह सही टोकन लौटाता है जिसे मैं पहले से ही देखता हूं, क्योंकि जब मैं 'app.delegate' में कनेक्शन स्थापित करता हूं, तो यह काम करता है, मुझे विश्वास है कि टोकन समय का निर्माण यहां समस्या है। – sinusGob

उत्तर

0

मैं सुझाव है कि आप इस तरह कीचेन उपयोग करने के लिए:

let keychain = KeychainSwift() 
keychain.set("string", forKey: "key") 
keychain.get("key") 
keychain.delete("key") 

कीचेन उपयोग:

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 वेब टोकन एक JSON आधारित पहुंच टोकन है कि कुछ संख्या पर जोर बनाने के लिए खुला मानक है दावों का

+0

यदि मेरा उत्तर आपके लिए उत्तर स्वीकार करता है या उत्तर देता है, धन्यवाद। – aghilpro

संबंधित मुद्दे