Description:
I’m implementing a Socket.IO connection in an iOS app using socket.io-client-swift. The backend uses authentication via headers (user-id and sessionkey). The issue I’m facing is:
The client appears to connect successfully, even with invalid headers.
However, the server never receives the emitted events, nor does it respond with any data.
On Android/Postman, the socket connects but disconnects immediately if the auth headers are invalid — which is expected and correct.
On iOS, the socket stays connected even with wrong headers, but behaves like a “phantom connection” — no event delivery, no server response.
SocketManager Code (Note: This was generated by ChatGPT, I had one which I made but after 2 days of debugging and repetitions this is what I have landed on)
import SocketIO
final class SocketManager {
static let shared = SocketManager()
private var manager: SocketIO.SocketManager?
private var socket: SocketIOClient?
private init() {}
func connect(
userId: String,
sessionKey: String,
onMessageReceived: @escaping ([String: Any]) -> Void,
onSenderMessage: @escaping ([String: Any]) -> Void
) {
guard let url = URL(string: " else {
print("Invalid URL")
return
}
let config: SocketIOClientConfiguration = [
.log(true),
.compress,
.extraHeaders([
"user-id": "\(userId)",
"sessionkey": sessionKey
]),
.forceNew(true),
.reconnects(true)
]
self.manager = SocketIO.SocketManager(socketURL: url, config: config)
self.socket = self.manager?.defaultSocket
guard let socket = self.socket else { return }
socket.on(clientEvent: .connect) { data, ack in
print("Socket connected")
}
socket.on("receiver-message") { data, _ in
guard let json = data.first as? [String: Any] else { return }
onMessageReceived(json)
}
socket.on("sender-message") { data, _ in
guard let json = data.first as? [String: Any] else { return }
onSenderMessage(json)
}
socket.on(clientEvent: .disconnect) { _, _ in
print("Socket disconnected")
}
socket.on(clientEvent: .error) { data, _ in
print("Socket error", data)
}
socket.connect()
}
func sendMessage(messageData: [String: Any]) {
guard socket?.status == .connected else {
print("Socket not connected. Message not sent.")
return
}
socket?.emit("sendMessage", messageData)
}
func disconnect() {
socket?.disconnect()
}
}
I’ve tried multiple configurations and approaches for last 2 days.