Socket.io监听方法在某段时间或互联网连接丢失后不听

时间:2017-05-26 19:59:28

标签: ios swift socket.io

我正在使用应用的聊天功能,所以我在iOS应用中使用Socket.io节点和swift作为客户端。

我在应用程序的某个部分有一个这样的类:

delete[]

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

在viewController中,我有一个类似于这个的方法:

   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)
   }

   ...

   }

此代码效果很好,但只有几分钟。然后,对话中的一个或两个参与者不会收到任何新消息。换句话说,swift中的socket-client代码在一段时间后不再监听。 我注意到,当我断开网络连接并重新连接时,会发生此错误。

我尝试重新连接套接字,运行" on方法"在聊天过程中每一段时间或某些事件(例如互联网连接丢失),但没有结果。

为什么socket在某些消息后停止监听事件?

1 个答案:

答案 0 :(得分:0)

以下是处理套接字连接丢失的示例,对我来说效果很好 也许这可以帮助

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()