A real-time list of your app’s requests, grouped by the screen on display when they started. Search, filter by status class and method.
Observation, not interception
Your request stays yours.
Many in-app debuggers take your request, stop it before it leaves, send a copy from their own session to get the response, then hand that response back to your app. DiagnosticSDK listens to your session instead.
Classic interceptor
Your URLSession
Your appInterceptorIts own URLSessionServer
1Stops your request before it leaves
2Sends a copy from its own URLSession
3Hands the response back to your app
Your URLSessionConfiguration: headers, timeouts, cookies, cache, proxy
Your delegate and its SSL pinning, mTLS certificates and authentication challenges
If your backend needs this configuration (an mTLS certificate, pinning, a proxy, session headers), your app stops working with such a debugger. It only works again once you hand that configuration to the debugger, so it can rebuild it in its own URLSession.
DiagnosticSDK
Your app
Your URLSession
GET
DiagnosticSDK
Server
Your configuration is used as it is
Your delegate runs: SSL pinning, mTLS, authentication challenges
No proxy, no certificate to install
The request is the one your app sends, so it works wherever your app works.
How it works
One request, three moments.
Follow one request. At each moment, the SDK reads one more piece of it. It never changes the request.
1 · Start
Your code calls resume()
The SDK notes the start time and the screen on display.
request
GET /v1/accounts
screen
HomeViewController
started
10:32:04.412
2 · On the way
iOS sends the request as usual
Each callback reaches your delegate first, unchanged. Then the SDK reads the status and the response.
request
GET /v1/accounts
status
200
response
{ "accounts": [ … ] }
3 · Done
The request shows up in Live
iOS hands over its own timing measurements. The request appears under its screen, complete.
request
GET /v1/accounts
network
124 ms
app
151 ms · h2
What stays exactly as it was
The request leaves once, from your own session.
Your delegate receives every call, unchanged.
Pinning, mTLS, cookies, cache and timeouts keep working.
The timings are those of the real request.
Timing measured by iOS
Where did the 124 ms go?
Live does not time the request from the outside. It reads the measurements iOS takes during the exchange (URLSessionTaskMetrics) and splits them into steps.
Networkmeasured by iOS
124 ms
Felt by your appfrom resume() to your code
151 ms
The striped 27 ms: the request waited before leaving, or the response waited before reaching your code, for example on a busy queue.
DNS lookup9 msFinding the server address. Long? Slow DNS, or the first call to this domain.
Connection18 msOpening the connection. It disappears when a connection is reused.
TLS handshake27 msSetting up encryption. On every request? Connections are not being reused.
Request sent2 msThe request and its body leave the phone. Long? Large upload or slow network.
Server wait56 msYour backend prepares the response (time to first byte). Long? Look at the server.
Download12 msThe response arrives. Long? Heavy response or slow network.
Protocol
h2
Reused connection
No
Served from cache
No
Redirects
0
Received
18 kB
When iOS gives no measurements, Live says so (source: Clock) and only shows the duration felt by your app.
Example values.
Screen attribution
Each request, under its screen.
Live files every request under the screen on display when it started, so you read the traffic in the order of the navigation.
A JWT in a header or a body? Live shows what it contains.
eyJhbGciOi….eyJzdWIiOiI0Mi….SflKxw…
sub 42 · exp 10:47
What Live does not see
The limits, stated clearly.
WKWebView
Pages in a WKWebView load in WebKit’s own process, outside your app. Their requests, including fetch and XHR calls from the page, never go through your URLSession, so Live cannot see them.
Requests your app makes itself with URLSession, around the web view, are captured.
Outside URLSession
Live sees HTTP and HTTPS requests made with URLSession. WebSockets, Network.framework connections, raw sockets and libraries with their own network stack are not captured.
Libraries built on URLSession are captured like the rest.
Non-JSON bodies
A body is saved only when its Content-Type contains application/json or +json. Other bodies (HTML, images, form data, plain text, or JSON sent without that header) are not saved: a short note with their type takes their place. Only JSON responses can be replayed.
URL, method, headers, status, size and timing are still recorded.