我正在使用应用的聊天功能,所以我在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在某些消息后停止监听事件?
答案 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()