iOS Safari can leave a blocked wss:// upgrade hanging without firing onclose/onerror, so the badge sat on "connecting". The socket now times out a slow handshake after 5s, reports at most one failure per attempt, and the app commits to polling after a 6s grace period if the socket never opens.