davidstump / SwiftPhoenixClient

Connect your Phoenix and iOS applications through WebSockets!
MIT License
512 stars 147 forks source link

"Socket is not connected" error after backgrounding #258

Open KaylaBrady opened 3 months ago

KaylaBrady commented 3 months ago

I'm following the example for disconnecting from a socket when the app is backgrounded for my SwiftUI app. After calling socket.disconnect() using v5.3.3 of this library, I reliably get the following error message at PhoenixTransport.swift#L293 Error when receiving Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=wss://phoenix-chat.fly.dev/socket/websocket?vsn=2.0.0, NSErrorFailingURLKey=wss://phoenix-chat.fly.dev/socket/websocket?vsn=2.0.0}.

Here is an example app that doesn't involve joining any channels for simplicity, though I still get this error message when channels have been joined & left too.

I would expect no error message in this case since the socket has been intentionally closed.

struct ContentView: View {
    let socket: Socket = .init("https://phoenix-chat.fly.dev/socket/websocket")
    @Environment(\.scenePhase) var scenePhase

    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
        }
        .onAppear {
            socket.onOpen {
                print("Socket opened")
            }
            socket.onClose { code, reason in
                print("Socket closed \(code) \(reason)")
            }
        }.onChange(of: scenePhase) { newPhase in
            if newPhase == .active {
                socket.connect()
            }
            if newPhase == .background {
                socket.disconnect(code: .normal, reason: "Backgrounded", callback: nil)
            }
        }
        .padding()
    }

Here are the full logs from opening the app, backgrounding it, and re-opening it.

Socket opened
Socket closed 1000 Optional("Backgrounded")
Error when receiving Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=wss://phoenix-chat.fly.dev/socket/websocket?vsn=2.0.0, NSErrorFailingURLKey=wss://phoenix-chat.fly.dev/socket/websocket?vsn=2.0.0}
Socket opened
dsrees commented 2 months ago

This error is benign, the print statement in the receive loop can be removed.

Upon testing, self (which is the WebSocketTask) is nil and the reconnect logic is not triggered. The correct solution here is to just remove the print call on PhoenixTransport.swift:293.