TN3135 describes the exception that lets a watchOS app use low-level networking while it holds an active audio session. I have that working, and the app functions — but the network path is withdrawn and restored on a strikingly regular cycle, and I would like to know whether that is expected behaviour rather than something I am doing wrong.
Setup
- Apple Watch Series 10 (Watch7,9), watchOS 26.5. Reproduced on a Series 6 (Watch6,2).
UIBackgroundModes: [audio];AVAudioSessioncategory.playAndRecord, mode.spokenAudio; activated with the asyncactivate(options:completionHandler:).NWConnectionwithNWProtocolWebSocketto a WebSocket relay over TLS.- The app streams 16 kHz mono PCM continuously while transmitting and holds the socket open otherwise.
Symptom
NWPathMonitor reports .unsatisfied, then .satisfied about two seconds
later, over and over. Measured with the iPhone powered off, so the watch was
on its own Wi-Fi:
| 36.4 s | 2.1 s |
| 36.7 s | 1.9 s |
| 36.9 s | 2.1 s |
The regularity is what prompts the question — uptime varies by ±0.3 s and the outage is consistently 2.0 s. That reads as a timeout expiring rather than radio behaviour.
What I have ruled out
- Not the network or the server. A browser client on the same relay, same TLS, same wire protocol, holds a WebSocket indefinitely.
- Not the interface. Identical cadence over the companion
ipsec1tunnel with the iPhone present, and over the watch's ownen0with the iPhone powered off. PinningrequiredInterfaceType = .wifiwhile the iPhone is reachable fails outright — the path offers onlyipsec1. - Not audio-session interruption. I observe
interruptionNotification,routeChangeNotification,mediaServicesWereResetNotificationandsilenceSecondaryAudioHintNotification. None fire at a drop. At the moment the path goes.unsatisfied, the engine is running and the player node is actively playing. - Not session idleness. Playing continuous silence for the whole session, rather than only while reconnecting, made no difference — still 36.4 s.
The control that surprised me
To test whether this affects any long-lived watch socket or only
audio-unlocked ones, I built a second app with no AVAudioSession at all, no
audio background mode, holding a URLSessionWebSocketTask and kept alive by a
WKExtendedRuntimeSession so screen sleep was not a factor.
It never connected. NWPathMonitor reported .unsatisfied once and never
changed, across a 30 s run, and every request failed with "The Internet
connection appears to be offline." I had expected URLSession to be permitted
regardless.
Questions
- Does the audio-session networking exception in TN3135 have a defined lifetime, and is a periodic revoke/re-grant cycle expected?
- If so, is there a supported way to hold it continuously — or is the correct design simply to expect the interruption and reconnect through it?
- Is it expected that an app with no audio session gets no network path at
all on watchOS, including via
URLSession, even in the foreground with an extended runtime session?