Websockets (WS/WSS) in iOS26

We're having trouble connecting to local area network websockets in Safari in the latest iOS26 Beta 3 (iPhone 14), both secure and unsecure. Code works < iOS26 & macOS, etc.

--

Unsecure behaviour: need to call connectWebSocket() twice, establishes connection reliably. Calling connectWebSocket() once, will sometimes work, sometimes not.

--

Secure behaviour: Error in debug console, even though the certificate has been accepted and the page is loaded as https. Error:

WebSocket connection to 'wss://192.168.1.81/api/webSocket' failed: The certificate for this server is invalid. You might be connecting to a server that is pretending to be “192.168.1.81”, which could put your confidential information at risk.

--

let apiEndpoint = window.location.hostname;
if (apiEndpoint == null || apiEndpoint == '') {
apiEndpoint = "192.168.1.81";
}

function connectWebSocket() {
	if (webSocket && webSocket.readyState == 1) {
		return;
	}
	
	if (webSocket) {
		webSocket.close();
	}

	webSocket = new WebSocket(
			(window.location.protocol === 'https:' ? "wss://" : "ws://") + apiEndpoint + "/api/webSocket",
	);

	webSocket.onerror = (error) => {
			console.log("WebSocket error", error);
	};

	webSocket.onopen = () => {
			console.log("WebSocket connected");
			webSocket.send("volume");
			webSocket.send("isPlaying");
	};

	webSocket.onmessage = (event) => {
			const msg = event.data;
			if (!msg) return;

			if (msg.startsWith("volume")) {
					const volume = parseInt(msg.replace('volume:',''));
					const slider = document.getElementById("volumeSlider");
					slider.value = volume;
					slider.style.background = `linear-gradient(to right, #007bff ${volume}%, white ${volume}%)`;
			} else if (msg.startsWith("isPlaying")) {
				const url = msg.replace('isPlaying:', '');
				let matchedEntry = null;
				let coverToSelect = null;
			
				categories.forEach((category, catIdx) => {
					category.entries.forEach((entry, entryIdx) => {
						if (entry.url === url) {
							matchedEntry = entry;
							coverToSelect = document.querySelector(`.cover[category-idx="${catIdx}"][entry-idx="${entryIdx}"]`);
						}
					});
				});
			
				if (matchedEntry && coverToSelect) {
					selectCover(coverToSelect, true);
					showNowPlayingBar(matchedEntry);

					const top = coverToSelect.getBoundingClientRect().top + window.scrollY - 150;
					window.scrollTo({ top, behavior: 'smooth' });
				}
			}
	};

	webSocket.onclose = () => {
			console.log("WebSocket closed, retrying...");
			setTimeout(connectWebSocket, 1000);
	};
}

document.addEventListener("visibilitychange", () => {
	if (document.visibilityState === "visible") {
		connectWebSocket();
	}
});

connectWebSocket();
Websockets (WS/WSS) in iOS26
 
 
Q