【问题标题】:Socket.io listen methods don't listen after sometime or when Internet connection is lostSocket.io 侦听方法在某个时间或 Internet 连接丢失时不侦听
【发布时间】:2017-10-27 19:18:39
【问题描述】:

我正在开发应用程序的聊天功能,因此我在 iOS 应用程序的客户端使用 Socket.io 和 node 和 swift。

我在应用程序的某些部分有这样的课程:

   class SocketIOManager: NSObject {
       // Socket manager instantiation
    static let sharedInstance = SocketIOManager()
    static let urls = EndpointsURLs()
    var socket = SocketIOClient(socketURL: URL(string: urls.urlSocket)!, config: [.log(false), .forcePolling(true), .doubleEncodeUTF8(true)])

    override init() {
        super.init()  
    }

    func establishConnection() {
        socket.connect()  
    }

    func closeConnection() {
        socket.disconnect()
    } 

   // Emit events:
   func emitExample(argument: String){
        // Custom emit event
        let data: NSDictionary = ["argument": argument]
        socket.emit("local join", data)
   }

   ...

   }

我在 AppDelegate.swift 中使用 establishConnection() 方法。

在 viewController 我有一个类似的方法:

func listenEvents(){
     SocketIOManager.sharedInstance.socket.off("message")
     SocketIOManager.sharedInstance.socket.on("message") { (data, ack) in
         // Do some actions

     }

     ....

     SocketIOManager.sharedInstance.socket.off("otherEvent")
     SocketIOManager.sharedInstance.socket.on("otherEvent") { (data, ack) in
         // Do some actions

     }}

此代码运行良好,但只能运行几分钟。然后,对话中的一个或两个参与者不会收到任何新消息。换句话说,swift中的套接字客户端代码在一定时间后不再监听。 我注意到,当我断开互联网并重新连接时,总是会发生此错误。

我曾尝试重新连接套接字,每次运行“on 方法”或在聊天期间发生事件(例如 Internet 连接丢失),但没有任何结果。

为什么套接字在一些消息后停止监听事件?

【问题讨论】:

    标签: ios swift socket.io


    【解决方案1】:

    以下是处理套接字连接丢失的示例,它适用于我 也许这会有所帮助

    func getChatMessage(_ UserLoginDetails: [AnyHashable : Any]?, withCompletion completionHandler: @escaping (_ Server_Response: [AnyHashable]?) -> Void) {
    var UserLoginDetails = UserLoginDetails
    if let UserLoginDetails = UserLoginDetails {
        print("\(UserLoginDetails)")
    }
    
    var userdata = UserLoginDetails
    let roomid = userdata?["roomId"] as? String
    UserLoginDetails = nil
    
    if socket.status() != SocketIOStatusConnected {
        socket.on("connect", callback: { data, ack in
            if userdata != nil {
                self.socket.emit("getMessages", with: [userdata])
                self.socket.off(roomid)
                self.socket.on(roomid, callback: { data, ack in
    
                    completionHandler(data)
                })
                userdata = nil
            }
        })
    } else {
    if userdata != nil {
        socket.emit("getMessages", with: [userdata])
        socket.off(roomid)
        socket.on(roomid, callback: { data, ack in
            completionHandler(data)
        })
        userdata = nil
    }}socket.connect()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2011-12-10
      • 1970-01-01
      • 2012-04-01
      • 2018-04-26
      • 1970-01-01
      • 2019-08-19
      相关资源
      最近更新 更多