I'm creating a chat app using websocket.
I'm connecting to server with URLSessionWebSocketTask.
url = ws://"appname".herokuapp.com/chats/listen/
func connect(url: String) {
    self.socket = session.webSocketTask(with: URL(string: url)!)
    self.listen()
    self.socket.resume()
}
func listen() {
    self.socket.receive { [weak self] (result) in
        guard let self = self else { return }
        switch result {
        case .failure(let error):
            print(error)
            return
        case .success(let message):
            switch message {
            case .data(let data):
                self.handle(data)
            case .string(let str):
                guard let data = str.data(using: .utf8) else { return }
                self.handle(data)
            @unknown default:
                break
            }
        }
        
        self.listen()
    }
}
It's running okay on localhost, but after I deploy the server to Heroku, I get this message:
NSPOSIXErrorDomain Code=57 "Socket is not connected
I guest it was auto disconnect after a time out. 
So, I add ping function to ping every 10s. Then, it works:
func sendPing() {
    self.socket.sendPing { (error) in
        if let error = error {
            print("Sending PING failed: \(error)")
        }
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
            self.sendPing()
        }
    }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With