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]; AVAudioSession category .playAndRecord,
mode .spokenAudio; activated with the async
activate(options:completionHandler:).
NWConnection with NWProtocolWebSocket to 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:
Uptime between drops
Outage
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 ipsec1 tunnel
with the iPhone present, and over the watch's own en0 with the iPhone
powered off. Pinning requiredInterfaceType = .wifi while the iPhone is
reachable fails outright — the path offers only ipsec1.
Not audio-session interruption. I observe
interruptionNotification, routeChangeNotification,
mediaServicesWereResetNotification and
silenceSecondaryAudioHintNotification. 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?
1
0
48